使用URLComponents和URLQueryItem在Swift中构建安全URL

构造URL是每个Swift开发人员在构建iOS应用程序时都会执行的一项日常任务。 确保我们构建的网址安全且使用百分比编码格式正确编码非常重要。 构造URL的最简单且最容易崩溃的方法是使用传递原始字符串的URL Struct String initalizer。

   searchTerm =“ obi wan kenobi” 
let format =“ wookiee”
url = URL(字符串:“ https://swapi.co/api/people/?search= \(searchTerm)&format = \(format)“)! //异常(致命错误)!

虽然它适用于没有查询参数的简单URL,但是当我们手动将查询参数添加到未使用百分比编码正确编码的字符串时,就会出现不安全行为。 手动为每个查询参数附加字符串的过程也很容易出错。

输入URLComponents和URLQueryItem

为了解决此问题,Apple的Foundation框架实际上提供了两种类型的Struct,我们可以将其用作构建带有安全查询参数的URL的构件,它们是URLComponentsURLQueryItem 。 URL由许多部分组成,例如方案,主机,路径和查询。 使用URLComponents结构,我们可以通过手动指定方案,主机和路径来安全地构建URL。

为了安全处理查询参数的百分比编码, URLComponents还公开了queryItems作为属性。 QueryItems是URLQueryItem的数组,我们可以使用URLQueryItem初始化程序传递查询参数的名称和值。 通过分配queryItems数组, URLComponents将在内部添加查询参数的百分比编码。

将键值字符串的字典映射到URLQueryItem数组

我们可以使用的另一种有用模式是将查询参数封装在具有String作为键和值的Dictionary内。 我们使用一个接受Dictionary的变异函数向URLComponents添加扩展,然后使用每个项目键和值将Dictionary映射到URLQueryItem数组,然后将其分配给URLComponents queryItems属性。

使用URLComponents和URLQueryItems构建SWAPI API存储库(示例)

这是一个示例,说明如何使用URLComponents和URLQuery项目作为每个端点的构建块来构建Remote DataRepository类。 我们还将为每个Planets, Spaceships, Vehcicles, People, Films, Species, Wookiee format, JSON format SWAPI资源和SWAPI格式添加带有String enum ,这将用作强类型参数来指定所需的资源和格式。

在内部,它将使用URLComponents构造URL,并使用资源设置路径,并使用Dictionary构造URLQueryItem的格式和搜索查询参数,然后使用URLSession Data任务获取数据。

结论

使用URLComponenetsURLQueryItem在Swift中构建URL非常简单,也非常简单。 我们可以使用许多改进来改进我们的API调用,其中一篇启发我并建议您阅读的文章是Sundell的Swift(在Swift中构造URL) 通过创建一个简单的Endpoint Struct(使用URLComponentsURLQueryItem来安全地构建带有查询参数的URL),他巧妙地封装了API Endpoint。