Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)

相关文章系列: (文章代码均已升级至Swift3)
[当前文章] Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)
Swift - HTTP网络操作库Alamofire使用详解2(文件上传)
Swift - HTTP网络操作库Alamofire使用详解3(文件下载,断点续传)
Swift - HTTP网络操作库Alamofire使用详解4(用户权限认证)

一,Alamofire的说明与配置

1,什么是Alamofire
(1) Alamofire 的前身是  AFNetworkingAFNetworking 是  iOS 和  OS X 上很受欢迎的第三方HTTP网络基础库。
(2)其实  AFNetwork 的前缀  AF 便是  Alamofire 的缩写。
(3) Swift发布后, AFNetworking的作者又用 Swift语言写了个相同功能的库,这便是  Alamofire
(4) Alamofire 本质是基于` URLSession`,并做了封装。使用  Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
关于Cookie:
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 拖拽至你的工程中
原文:Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)

(3)工程 ->  General ->  Embedded Binaries项,把iOS版的framework添加进来:  Alamofire.framework
原文:Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)

原文:Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)

(4)最后,在需要使用  Alamofire 的地方  import 进来就可以了
1
import  Alamofire

二,使用Alamofire进行数据请求 

1,以GET请求为例
(1)不带参数,不带结果处理
1
Alamofire .request( "https://httpbin.org/get" )

(2)带参数,不带结果处理
1
Alamofire .request( "https://httpbin.org/get" , parameters: [ "foo" "bar" ])

(3)带参数,也带结果处理(这里以返回结果为json格式的为例)
1
2
3
4
5
6
7
8
9
10
11
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内容可看下方“响应处理”部分
              }
          }

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
8
9
10
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
1
2
3
4
5
6
7
8
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
1
2
3
4
5
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": "hangge",
        "phones": [
            {
                "name": "公司",
                "number": "123456"
            },
            {
                "name": "家庭",
                "number": "001"
            }
        ]
    },
    {
        "name": "big boss",
        "phones": [
            {
                "name": "公司",
                "number": "111111"
            }
        ]
    }
]
使用responseJSON自动解析json数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Alamofire .request( "http://www.hangge.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)
         }
}
responseJSON也可以配合  SwiftyJSON 一起使用,具体可以查看我原来写的这篇文章: Swift - SwiftyJSON的使用详解 

(6)同样也支持链式的返回结果处理
1
2
3
4
5
6
7
Alamofire .request( "https://httpbin.org/get" )
          .responseString { response  in
              print ( "Response String: \(response.result.value)" )
          }
          .responseJSON { response  in
              print ( "Response JSON: \(response.result.value)" )
          }
3,请求类型(HTTP Methods)
除了上面使用的  .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"
}
比如要使用  POST 请求,把  Alamofire.request 第二个参数做修改即可:
1
Alamofire .request( "http://httpbin.org/post" , method: .post)

4,请求参数(Parameters)
(1)使用GET类型请求的时候,参数会自动拼接在url后面
1
2
Alamofire .request( "https://httpbin.org/get" , parameters: [ "foo" "bar" ])
(2)使用POST类型请求的时候,参数是放在在HTTP body里传递,url上看不到
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
     ]
]
 
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

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"
     ]
]
 
Alamofire .request( "https://httpbin.org/post" , method: .post, parameters: parameters,
                   encoding:  JSONEncoding . default )
// HTTP body: {"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 . "|" ;
}
//输出: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"
]
 
Alamofire .request( "https://httpbin.org/headers" , headers: headers)
         .responseJSON { response  in
             debugPrint(response)
         }

三,判断数据请求是否成功,并做相应的处理
在请求响应对象之前调用的  .validate() 函数是另一个易用的 Alamofire 特性。
将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。
比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。
1
2
3
4
5
6
7
8
9
10
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)
         }
}

四,打印调试(print和debugPrint)
不管是  request对象还是  response对象都是支持打印输出的。根据不同的调试需求,我们可以自行选择使用  print 还是  debugPrint
1,打印request对象
1
2
3
4
5
6
let  request =  Alamofire .request( "https://httpbin.org/ip" , parameters: [ "foo" "bar" ])
print (request)
 
/********** 下面是控制台输出 ***************
******************************************/
1
2
3
4
5
6
7
8
9
10
let  request =  Alamofire .request( "https://httpbin.org/ip" , parameters: [ "foo" "bar" ])
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
Alamofire .request( "https://httpbin.org/get" )
     .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" ,
   "url" "https://httpbin.org/get"
}
******************************************/
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
Alamofire .request(. GET "https://httpbin.org/get" )
     .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" ,
   "url" "https://httpbin.org/get"
}
 
******************************************/

原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_970.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值