在上一篇文章 Alamofire(一)-- 网络基础TCP/IP协议简述 中,我们了解了关于 TCP/IP 协议相关的基础知识,这一篇文章让我们正式进入我们的主题 Alamofire 。 我们都知道, iOS 开发中,有成千上万的 APP 和工程师都会依赖广受欢迎的 AFNetworking 这个三方框架库实现与服务器的交互、 json 解析、还有提供占位图片等很多功能,需要做到这些是很不容易的,接下来,我们就来了解 Alamofire ,作为学习引荐保留。

Alamofire的说明与配置

  • Alamofire 的前身是 AFNetworking
  • AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
  • 自从 Swift 发布后, AFNetworking 的作者又用 Swift 语言写了个相同功能的库,就是 Alamofire
  • Alamofire 本质是基于 URLSession ,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
  • 链式的请求/响应方法
  • URL / JSON / plist 参数编码
  • 上传类型支持:文件( File )、数据( Data )、流( Stream )以及 MultipartFormData
  • 支持文件下载,下载支持断点续传
  • TLS Certificate and Public Key Pinning
  • Progress Closure & NSProgress
  • 支持使用 NSURLCredential 进行身份验证
  • HTTP 响应验证
  • 安装与配置

  • 具体的安装方法看这里: github.com/Alamofire/A…
  • 最后,在需要使用 Alamofire 的地方 import 进来就可以了
  • import Alamofire
    复制代码

    数据请求

    GET请求

    不带参数,不带结果处理

    Alamofire.request("https://httpbin.org/get")
    复制代码

    带参数,不带结果处理

    Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
    复制代码

    带参数,也带结果处理(这里以返回结果为json格式的为例)

    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内容可看下方“响应处理”部分
    复制代码

    响应处理(Response Handling)

    (1)除了上面样例使用的 responseJSON (处理 json 类型的返回结果)外, Alamofire 还提供了许多其他类型的响应处理方法:

    response()
    responseData()
    responseString(encoding: NSStringEncoding)
    responseJSON(options: NSJSONReadingOptions)
    responsePropertyList(options: NSPropertyListReadOptions)
    复制代码

    (2)Response Handler

    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

    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

    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": "Harvey",        "phones": [            {                "name": "公司",                "number": "123456"            },            {                "name": "家庭",                "number": "001"            }        ]
            "name": "big boss",
            "phones": [
                    "name": "公司",
                    "number": "111111"
    复制代码

    使用 responseJSON 自动解析 json 数据:

    Alamofire.request("http://www.baidu.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)
    复制代码

    (6)同样也支持链式的返回结果处理

    Alamofire.request("https://httpbin.org/get")
             .responseString { response in
                 print("Response String: \(response.result.value)")
             .responseJSON { response in
                 print("Response JSON: \(response.result.value)")
    复制代码

    请求类型(HTTP Methods)

    除了上面使用的 .Get 类型(不指定的话,默认都是使用 Get 请求)。 Alamofire 还定义了许多其他的 HTTP 方法( HTTP Medthods )可以使用。

    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 第二个参数做修改即可:

    Alamofire.request("http://httpbin.org/post", method: .post)
    复制代码

    请求参数(Parameters)

    (1)使用 GET 类型请求的时候,参数会自动拼接在 url 后面

    Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])
    // https://httpbin.org/get?foo=bar
    复制代码

    (2)使用 POST 类型请求的时候,参数是放在在 HTTP body 里传递, url 上看不到

    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
    复制代码

    参数编码方式(Parameter Encoding)

    除了默认的方式外, Alamofire 还支持 URL JSON PropertyList 以及自定义格式方式编码参数。 比如我们想要把一个字典类型的数据,使用 json 格式发起 POST 请求(数据将放在 body 中传输):

    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"}}
    复制代码

    支持自定义Http头信息(HTTP Headers)

    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)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。 比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。

    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)
    复制代码

    总结

    常用的网络请求方法配置就这些了,这里 hangge 会有更详细的解说。

    分类:
    iOS
  •