使用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的构件,它们是URLComponents
和URLQueryItem
。 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任务获取数据。
结论
使用URLComponenets
和URLQueryItem
在Swift中构建URL非常简单,也非常简单。 我们可以使用许多改进来改进我们的API调用,其中一篇启发我并建议您阅读的文章是Sundell的Swift(在Swift中构造URL) 通过创建一个简单的Endpoint Struct(使用URLComponents
和URLQueryItem
来安全地构建带有查询参数的URL),他巧妙地封装了API Endpoint。