一,Alamofire的说明与配置
1,什么是Alamofire
(1)Alamofire 的前身是 AFNetworking。AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方HTTP网络基础库。
(2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
(3)Swift发布后,AFNetworking的作者又用Swift语言写了个相同功能的库,这便是 Alamofire。
(4)Alamofire 本质是基于`NSURLSession`,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
关于Cookie:
Alamofire是基于NSURLRequest封装的,所以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 进来就可以了
二,使用Alamofire进行数据请求
1,以GET请求为例
(1)不带参数,不带结果处理
(2)带参数,不带结果处理
(3)带参数,也带结果处理(这里以返回结果为json格式的为例)
1
2
3
4
5
6
7
8
9
10
11
|
.responseJSON { response in
print (response.request)
print (response.response)
print (response.data)
print (response.result)
if let JSON = response.result.value {
print ( "JSON: \(JSON)" )
}
}
|
2,响应处理(Response Handling)
(1)除了上面样例使用的responseJSON(处理json类型的返回结果)外,Alamofire还提供了许多其他类型的响应处理方法:
response()
responseData()
responseString(encoding: NSStringEncoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: NSPropertyListReadOptions)
(2)Response Handler
1
2
3
4
5
6
7
|
.response { request, response, data, error in
print (request)
print (response)
print (data)
print (error)
}
|
(3)Response Data Handler
1
2
3
4
5
6
|
.responseData { response in
print (response.request)
print (response.response)
print (response.result)
}
|
(4)Response String Handler
1
2
3
4
5
|
.responseString { response in
print ( "Success: \(response.result.isSuccess)" )
print ( "Response String: \(response.result.value)" )
}
|
(5)Response JSON Handler
使用responseJSON 方法的话,JSON数据会被自动转化为 NSDictionary或NSArray。假设我们返回的json数据格式如下:
[
{
"name": "hangge",
"phones": [
{
"name": "公司",
"number": "123456"
},
{
"name": "家庭",
"number": "001"
}
]
},
{
"name": "big boss",
"phones": [
{
"name": "公司",
"number": "111111"
}
]
}
]
使用responseJSON自动解析son数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
.responseJSON { response in
switch response.result {
case . Success :
if let items = response.result.value as ? NSArray {
for dict in items{
print (dict)
}
}
case . Failure ( let error):
print (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)" )
}
|
3,请求类型(HTTP Methods)
除了上面使用的 .Get 类型。Alamofire还定义了许多其他的HTTP 方法(HTTP Medthods)可以使用。
1
2
3
|
public enum Method : String {
case OPTIONS , GET , HEAD , POST , PUT , PATCH , DELETE , TRACE , CONNECT
}
|
比如要使用 POST 请求,把 Alamofire.request 第一个参数做修改即可:
4,请求参数(Parameters)
(1)使用GET类型请求的时候,参数会自动拼接在url后面
(2)使用POST类型请求的时候,参数是放在在HTTP body里传递,url上看不到
1
2
3
4
5
6
7
8
9
10
11
12
|
let parameters = [
"foo" : "bar" ,
"baz" : [ "a" , 1],
"qux" : [
"x" : 1,
"y" : 2,
"z" : 3
]
]
|
5,参数编码方式(Parameter Encoding)
除了默认的方式外,Alamofire还支持URL、URLEncodedInURL、JSON、Property List以及自定义格式方式编码参数。
1
2
3
4
5
6
7
8
9
10
|
enum ParameterEncoding {
case URL
case URLEncodedInURL
case JSON
case PropertyList (format: NSPropertyListFormat , options: NSPropertyListWriteOptions )
case Custom (( URLRequestConvertible , [ String : AnyObject ]?) -> ( NSMutableURLRequest , NSError ?))
func encode(request: NSURLRequest , parameters: [ String : AnyObject ]?) -> ( NSURLRequest , NSError ?)
{ ... }
}
|
比如我们想要把一个字典类型的数据,使用json格式发起POST请求:
1
2
3
4
5
6
7
8
9
|
let parameters = [
"foo" : [1,2,3],
"bar" : [
"baz" : "qux"
]
]
|
服务端php页面可以这么取得发送过来的JSON数据:
1
2
3
4
5
6
7
8
|
<?
$postdata = json_decode( file_get_contents ( "php://input" ),TRUE);
$foo = $postdata [ "foo" ];
foreach ( $foo as $item ){
echo $item . "|" ;
}
|
6,支持自定义Http头信息(HTTP Headers)
1
2
3
4
5
6
7
8
9
|
let headers = [
"Authorization" : "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ,
"Content-Type" : "application/x-www-form-urlencoded"
]
.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 {
case . Success :
print ( "数据获取成功!" )
case . Failure ( let error):
print (error)
}
}
|
四,打印调试(print和debugPrint)
不管是 request对象还是 response对象都是支持打印输出的。根据不同的调试需求,我们可以自行选择使用 print 还是 debugPrint。
1,打印request对象
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)
}
*",
"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)
}
*",
"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" ,
}
******************************************/
|
六,使用Alamofire进行文件上传
1,Alamofire支持如下上传类型:
File
Data
Stream
MultipartFormData
2,使用文件流的形式上传文件
1
2
3
|
let fileURL = NSBundle .mainBundle(). URLForResource ( "hangge" , withExtension: "zip" )
|
附:服务端代码(upload.php)
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
|
<?php
function receiveStreamFile( $receiveFile ){
$streamData = isset( $GLOBALS [ 'HTTP_RAW_POST_DATA' ])? $GLOBALS [ 'HTTP_RAW_POST_DATA' ] : '' ;
if ( empty ( $streamData )){
}
if ( $streamData != '' ){
$ret = file_put_contents ( $receiveFile , $streamData , true);
} else {
$ret = false;
}
return $ret ;
}
$receiveFile = $_SERVER [ "DOCUMENT_ROOT" ]. "/uploadFiles/hangge.zip" ;
$ret |
|
请发表评论