在上一篇文章Alamofire(一)-- 网络基础TCP/IP协议简述中,我们了解了关于
TCP/IP
协议相关的基础知识,这一篇文章让我们正式进入我们的主题Alamofire
。
我们都知道,iOS
开发中,有成千上万的APP
和工程师都会依赖广受欢迎的AFNetworking
这个三方框架库实现与服务器的交互、json
解析、还有提供占位图片等很多功能,需要做到这些是很不容易的,接下来,我们就来了解Alamofire
,作为学习引荐保留。
Alamofire的说明与配置
概念
Alamofire
的前身是AFNetworking
。AFNetwork
的前缀AF
便是Alamofire
的缩写。- 自从
Swift
发布后,AFNetworking
的作者又用Swift
语言写了个相同功能的库,就是Alamofire
。Alamofire
本质是基于URLSession
,并做了封装。使用Alamofire
可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
功能特性
- 链式的请求/响应方法
URL
/JSON
/plist
参数编码- 上传类型支持:文件(
File
)、数据(Data
)、流(Stream
)以及MultipartFormData
- 支持文件下载,下载支持断点续传
TLS Certificate and Public Key Pinning
Progress Closure & NSProgress
- 支持使用
NSURLCredential
进行身份验证HTTP
响应验证
安装与配置
- 具体的安装方法看这里:https://github.com/Alamofire/Alamofire
- 最后,在需要使用
Alamofire
的地方import
进来就可以了
import Alamofire
数据请求
GET请求
不带参数,不带结果处理
Alamofire.request("https://httpbin.org/get")
带参数,不带结果处理
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
带参数,也带结果处理(这里以返回结果为json格式的为例)
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)") //具体如何解析json内容可看下方“响应处理”部分
}
}
响应处理(Response Handling)
(1)除了上面样例使用的responseJSON
(处理json
类型的返回结果)外,Alamofire
还提供了许多其他类型的响应处理方法:
response()
responseData()
responseString(encoding: NSStringEncoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: NSPropertyListReadOptions)
(2)Response Handler
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
.response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
print("Data: \(utf8Text)")
}
}
(3)Response Data Handler
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
.responseData { response in
debugPrint("All Response Info: \(response)")
if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) {
print("Data: \(utf8Text)")
}
}
(4)Response String Handler
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
.responseString { response in
print("Success: \(response.result.isSuccess)")
print("Response String: \(response.result.value)")
}
(5)Response JSON Handler
使用responseJSON
方法的话,JSON
数据会被自动转化为Dictionary
或Array
。假设我们返回的json
数据格式如下:
[
{
"name": "Harvey",
"phones": [
{
"name": "公司",
"number": "123456"
},
{
"name": "家庭",
"number": "001"
}
]
},
{
"name": "big boss",
"phones": [
{
"name": "公司",
"number": "111111"
}
]
}
]
使用responseJSON
自动解析json
数据:
Alamofire.request("http://www.baidu.com/jsonData.php")
.responseJSON { response in
switch response.result.isSuccess {
case true:
//把得到的JSON数据转为数组
if let items = response.result.value as? NSArray{
//遍历数组得到每一个字典模型
for dict in items{
print(dict)
}
}
case false:
print(response.result.error)
}
}
(6)同样也支持链式的返回结果处理
Alamofire.request("https://httpbin.org/get")
.responseString { response in
print("Response String: \(response.result.value)")
}
.responseJSON { response in
print("Response JSON: \(response.result.value)")
}
请求类型(HTTP Methods)
除了上面使用的 .Get
类型(不指定的话,默认都是使用Get
请求)。Alamofire
还定义了许多其他的HTTP
方法(HTTP Medthods
)可以使用。
public enum HTTPMethod: String {
case options = "OPTIONS"
case get = "GET"
case head = "HEAD"
case post = "POST"
case put = "PUT"
case patch = "PATCH"
case delete = "DELETE"
case trace = "TRACE"
case connect = "CONNECT"
}
如果使用 POST
请求,把 Alamofire.request
第二个参数做修改即可:
Alamofire.request("http://httpbin.org/post", method: .post)
请求参数(Parameters)
(1)使用GET
类型请求的时候,参数会自动拼接在url
后面
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
// https://httpbin.org/get?foo=bar
(2)使用POST
类型请求的时候,参数是放在在HTTP body
里传递,url
上看不到
let parameters:[String : Any] = [
"foo": "bar",
"baz": ["a", 1],
"qux": [
"x": 1,
"y": 2,
"z": 3
]
]
Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
参数编码方式(Parameter Encoding)
除了默认的方式外,Alamofire
还支持URL
、JSON
、PropertyList
以及自定义格式方式编码参数。
比如我们想要把一个字典类型的数据,使用json
格式发起POST
请求(数据将放在 body
中传输):
let parameters:[String : Any] = [
"foo": [1,2,3],
"bar": [
"baz": "qux"
]
]
Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters,
encoding: JSONEncoding.default)
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}
支持自定义Http头信息(HTTP Headers)
let headers: HTTPHeaders = [
"Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
"Accept": "application/json"
]
Alamofire.request("https://httpbin.org/headers", headers: headers)
.responseJSON { response in
debugPrint(response)
}
数据请求是否成功,并做相应的处理
在请求响应对象之前调用的 .validate()
函数是另一个易用的 Alamofire
特性。
将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。
比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
.validate()
.responseJSON { response in
switch response.result.isSuccess {
case true:
print("数据获取成功!")
case false:
print(response.result.error)
}
}
总结
常用的网络请求方法配置就这些了,这里hangge会有更详细的解说。