Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)
相关文章系列:
(文章代码均已升级至Swift3)
[当前文章] Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)
Swift - HTTP网络操作库Alamofire使用详解2(文件上传)
Swift - HTTP网络操作库Alamofire使用详解3(文件下载,断点续传)
Swift - HTTP网络操作库Alamofire使用详解4(用户权限认证)
[当前文章] Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)
Swift - HTTP网络操作库Alamofire使用详解2(文件上传)
Swift - HTTP网络操作库Alamofire使用详解3(文件下载,断点续传)
Swift - HTTP网络操作库Alamofire使用详解4(用户权限认证)
一,Alamofire的说明与配置
(1)
Alamofire 的前身是
AFNetworking。
AFNetworking 是
iOS 和
OS X 上很受欢迎的第三方HTTP网络基础库。
(2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
(3) Swift发布后, AFNetworking的作者又用 Swift语言写了个相同功能的库,这便是 Alamofire。
(4) Alamofire 本质是基于` URLSession`,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
(2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
(3) Swift发布后, AFNetworking的作者又用 Swift语言写了个相同功能的库,这便是 Alamofire。
(4) Alamofire 本质是基于` URLSession`,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
关于Cookie:
Alamofire是基于URLRequest封装的,所以Cookie会自动保存,就和浏览器请求是一个效果。而且网站Set_cookie多久,本地的Cookie就多久,每次请求的时候都会自动带上cookie,直到过期。(所以像登陆session这些的都不用我们手动去处理)
Alamofire是基于URLRequest封装的,所以Cookie会自动保存,就和浏览器请求是一个效果。而且网站Set_cookie多久,本地的Cookie就多久,每次请求的时候都会自动带上cookie,直到过期。(所以像登陆session这些的都不用我们手动去处理)
2,Alamofire的功能特性:
(1)链式的请求/响应方法
(2)URL / JSON / plist参数编码
(3)上传类型支持:文件(File )、数据(Data )、流(Stream)以及MultipartFormData
(4)支持文件下载,下载支持断点续传
(5)支持使用NSURLCredential进行身份验证
(6)HTTP响应验证
(7)TLS Certificate and Public Key Pinning
(8)Progress Closure & NSProgress
3,Alamofire的安装与配置
(1)从 GitHub 上下载最新的代码: https://github.com/Alamofire/Alamofire
(2)将下载下来的源码包中
Alamofire.xcodeproj 拖拽至你的工程中
(3)工程 ->
General ->
Embedded Binaries项,把iOS版的framework添加进来:
Alamofire.framework
(4)最后,在需要使用
Alamofire 的地方
import 进来就可以了
1
|
import
Alamofire
|
二,使用Alamofire进行数据请求
1,以GET请求为例
(1)不带参数,不带结果处理
1
|
|
(2)带参数,不带结果处理
1
|
|
(3)带参数,也带结果处理(这里以返回结果为json格式的为例)
1
2
3
4
5
6
7
8
9
10
11
|
.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内容可看下方“响应处理”部分
}
}
|
2,响应处理(Response Handling)
(1)除了上面样例使用的responseJSON(处理json类型的返回结果)外,Alamofire还提供了许多其他类型的响应处理方法:
response()
responseData()
responseString(encoding: NSStringEncoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: NSPropertyListReadOptions)
responseData()
responseString(encoding: NSStringEncoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: NSPropertyListReadOptions)
(2)Response Handler
1
2
3
4
5
6
7
8
9
10
|
.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)"
)
}
}
|
1
2
3
4
5
6
7
8
|
.responseData { response
in
debugPrint(
"All Response Info: \(response)"
)
if
let
data = response.result.value,
let
utf8Text =
String
(data: data, encoding: .utf8) {
print
(
"Data: \(utf8Text)"
)
}
}
|
1
2
3
4
5
|
.responseString { response
in
print
(
"Success: \(response.result.isSuccess)"
)
print
(
"Response String: \(response.result.value)"
)
}
|
使用responseJSON 方法的话,JSON数据会被自动转化为 Dictionary或Array。假设我们返回的json数据格式如下:
使用responseJSON自动解析json数据:
responseJSON也可以配合
SwiftyJSON 一起使用,具体可以查看我原来写的这篇文章:
Swift - SwiftyJSON的使用详解
(6)同样也支持链式的返回结果处理
3,请求类型(HTTP Methods)
除了上面使用的 .Get 类型(不指定的话,默认都是使用Get请求)。Alamofire还定义了许多其他的HTTP 方法( HTTP Medthods)可以使用。
比如要使用
POST 请求,把
Alamofire.request 第二个参数做修改即可:
4,请求参数(Parameters)
(1)使用GET类型请求的时候,参数会自动拼接在url后面
(2)使用POST类型请求的时候,参数是放在在HTTP body里传递,url上看不到
5,参数编码方式(Parameter Encoding)
除了默认的方式外,Alamofire还支持URL、JSON、PropertyList以及自定义格式方式编码参数。
比如我们想要把一个字典类型的数据,使用json格式发起POST请求:
服务端php页面可以这么取得发送过来的JSON数据:
6,支持自定义Http头信息(HTTP Headers)
三,判断数据请求是否成功,并做相应的处理
在请求响应对象之前调用的 .validate() 函数是另一个易用的 Alamofire 特性。
将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。
比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。
四,打印调试(print和debugPrint)
不管是 request对象还是 response对象都是支持打印输出的。根据不同的调试需求,我们可以自行选择使用 print 还是 debugPrint。
1,打印request对象
2,打印response对象
[
{
"name": "hangge",
"phones": [
{
"name": "公司",
"number": "123456"
},
{
"name": "家庭",
"number": "001"
}
]
},
{
"name": "big boss",
"phones": [
{
"name": "公司",
"number": "111111"
}
]
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
.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)同样也支持链式的返回结果处理
1
2
3
4
5
6
7
|
.responseString { response
in
print
(
"Response String: \(response.result.value)"
)
}
.responseJSON { response
in
print
(
"Response JSON: \(response.result.value)"
)
}
|
除了上面使用的 .Get 类型(不指定的话,默认都是使用Get请求)。Alamofire还定义了许多其他的HTTP 方法( HTTP Medthods)可以使用。
1
2
3
4
5
6
7
8
9
10
11
|
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"
}
|
1
|
|
4,请求参数(Parameters)
(1)使用GET类型请求的时候,参数会自动拼接在url后面
1
2
|
|
1
2
3
4
5
6
7
8
9
10
11
12
|
let
parameters:[
String
:
Any
] = [
"foo"
:
"bar"
,
"baz"
: [
"a"
, 1],
"qux"
: [
"x"
: 1,
"y"
: 2,
"z"
: 3
]
]
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
|
5,参数编码方式(Parameter Encoding)
除了默认的方式外,Alamofire还支持URL、JSON、PropertyList以及自定义格式方式编码参数。
比如我们想要把一个字典类型的数据,使用json格式发起POST请求:
1
2
3
4
5
6
7
8
9
10
|
let
parameters:[
String
:
Any
] = [
"foo"
: [1,2,3],
"bar"
: [
"baz"
:
"qux"
]
]
encoding:
JSONEncoding
.
default
)
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}
|
1
2
3
4
5
6
7
8
|
<?
$foo
=
$postdata
[
"foo"
];
foreach
(
$foo
as
$item
){
echo
$item
.
"|"
;
}
//输出:1|2|3|
|
6,支持自定义Http头信息(HTTP Headers)
1
2
3
4
5
6
7
8
9
|
let
headers:
HTTPHeaders
= [
"Authorization"
:
"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
,
"Accept"
:
"application/json"
]
.responseJSON { response
in
debugPrint(response)
}
|
三,判断数据请求是否成功,并做相应的处理
在请求响应对象之前调用的 .validate() 函数是另一个易用的 Alamofire 特性。
将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。
比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。
1
2
3
4
5
6
7
8
9
10
|
.validate()
.responseJSON { response
in
switch
response.result.isSuccess {
case
true
:
print
(
"数据获取成功!"
)
case
false
:
print
(response.result.error)
}
}
|
四,打印调试(print和debugPrint)
不管是 request对象还是 response对象都是支持打印输出的。根据不同的调试需求,我们可以自行选择使用 print 还是 debugPrint。
1,打印request对象
1
2
3
4
5
6
|
print
(request)
/********** 下面是控制台输出 ***************
******************************************/
|
1
2
3
4
5
6
7
8
9
10
|
debugPrint(request)
/********** 下面是控制台输出 ***************
$ curl -i \
-H "User-Agent: hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))" \
-H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \
-H "Accept-Language: zh-Hans-CN;q=1.0,en-CN;q=0.9" \
******************************************/
|
2,打印response对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
.responseString { response
in
debugPrint(response)
}
/********** 下面是控制台输出 ***************
SUCCESS: {
"args": {},
"headers": {
"Accept": "*/
*",
"Accept-Encoding"
:
"gzip;q=1.0,compress;q=0.5"
,
"Accept-Language"
:
"zh-Hans-CN;q=1.0,en-CN;q=0.9"
,
"Host"
:
"httpbin.org"
,
"User-Agent"
:
"hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))"
},
"origin"
:
"180.109.163.139"
,
}
******************************************/
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
.responseString { response
in
print
(response)
}
/********** 下面是控制台输出 ***************
[Request]: <NSMutableURLRequest: 0x7889c780> { URL: https://httpbin.org/get }
[Response]: <NSHTTPURLResponse: 0x7896f500> { URL: https://httpbin.org/get } { status code: 200, headers {
"Access-Control-Allow-Origin" = "*";
"Content-Length" = 354;
"Content-Type" = "application/json";
Date = "Tue, 08 Dec 2015 01:57:45 GMT";
Server = nginx;
"access-control-allow-credentials" = true;
} }
[Data]: 354 bytes
[Result]: SUCCESS: {
"args": {},
"headers": {
"Accept": "*/
*",
"Accept-Encoding"
:
"gzip;q=1.0,compress;q=0.5"
,
"Accept-Language"
:
"zh-Hans-CN;q=1.0,en-CN;q=0.9"
,
"Host"
:
"httpbin.org"
,
"User-Agent"
:
"hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))"
},
"origin"
:
"180.109.163.139"
,
}
******************************************/
|
原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_970.html