在上一篇文章
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
响应验证
安装与配置
具体的安装方法看这里:
github.com/Alamofire/A…
最后,在需要使用
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" ])
复制代码
(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)
复制代码
参数编码方式(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
会有更详细的解说。
1798
CallMeDoby
Alamofire