• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift:网络库Alamofire

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
一,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 进来就可以了
1
import Alamofire

二,使用Alamofire进行数据请求

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

(3)带参数,也带结果处理(这里以返回结果为json格式的为例)
1
2
3
4
5
6
7
8
9
10
11
Alamofire.request(.GET, "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
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
         .response { request, response, data, error in
             print(request)
             print(response)
             print(data)
             print(error)
          }
(3)Response Data Handler
1
2
3
4
5
6
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
         .responseData { response in
             print(response.request)
             print(response.response)
             print(response.result)
          }
(4)Response String Handler
1
2
3
4
5
Alamofire.request(.GET, "https://httpbin.org/get")
         .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
Alamofire.request(.GET, "http://www.hangge.com/jsonData.php")
    .responseJSON { response in
        switch response.result {
        case .Success:
            //把得到的JSON数据转为数组
            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
Alamofire.request(.GET, "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 类型。Alamofire还定义了许多其他的HTTP 方法(HTTP Medthods)可以使用。
1
2
3
public enum Method: String {
    case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
}
比如要使用 POST 请求,把 Alamofire.request 第一个参数做修改即可:
1
Alamofire.request(.POST, "http://httpbin.org/post")

4,请求参数(Parameters)
(1)使用GET类型请求的时候,参数会自动拼接在url后面
1
2
Alamofire.request(.GET, "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 = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]
 
Alamofire.request(.POST, "https://httpbin.org/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、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"
    ]
]
 
Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON)
// 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 = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Content-Type": "application/x-www-form-urlencoded"
]
 
Alamofire.request(.GET, "https://httpbin.org/get", headers: headers)
         .responseJSON { response in
             debugPrint(response)
         }

三,判断数据请求是否成功,并做相应的处理
在请求响应对象之前调用的 .validate() 函数是另一个易用的 Alamofire 特性。
将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。
比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。
1
2
3
4
5
6
7
8
9
10
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
    .validate()
    .responseJSON { response in
        switch response.result {
        case .Success:
            print("数据获取成功!")
        case .Failure(let error):
            print(error)
        }
}

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

1,Alamofire支持如下上传类型:
File
Data
Stream
MultipartFormData

2,使用文件流的形式上传文件
1
2
3
let fileURL = NSBundle.mainBundle().URLForResource("hangge", withExtension: "zip")
 
Alamofire.upload(.POST, "http://www.hangge.com/upload.php", file: fileURL!)
  附:服务端代码(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 
/** php 接收流文件
* @param  String  $file 接收后保存的文件名
* @return boolean
*/ 
function receiveStreamFile($receiveFile){   
    $streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : ''
   
    if(empty($streamData)){ 
        $streamData = file_get_contents('php://input'); 
    
   
    if($streamData!=''){ 
        $ret = file_put_contents($receiveFile, $streamData, true); 
    }else
        $ret = false; 
    
  
    return $ret;   
 
//定义服务器存储路径和文件名
$receiveFile $_SERVER["DOCUMENT_ROOT"]."/uploadFiles/hangge.zip"
$ret

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode337.打家劫舍III|HouseRobberIII发布时间:2022-07-13
下一篇:
swift的高阶函数的使用代码发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap