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

xiaoxiao2021-02-28  90

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

2015-12-07 相关文章系列: (文章代码均已升级至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 拖拽至你的工程中 (3)工程 ->  General ->  Embedded Binaries项,把iOS版的framework添加进来:  Alamofire.framework (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" ]) // https://httpbin.org/get?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 还是  debugPrint1,打印request对象 1 2 3 4 5 6 let  request =  Alamofire .request( "https://httpbin.org/ip" , parameters: [ "foo" :  "bar" ]) print (request)   /********** 下面是控制台输出 *************** GET https://httpbin.org/ip?foo=bar ******************************************/ 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" \      "https://httpbin.org/ip?foo=bar" ******************************************/ 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
转载请注明原文地址: https://www.6miu.com/read-47727.html

最新回复(0)