Alamofire(二)-- Alamofire配置、以及数据请求

在上一篇文章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响应验证

安装与配置

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数据会被自动转化为DictionaryArray。假设我们返回的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还支持URLJSONPropertyList以及自定义格式方式编码参数。
比如我们想要把一个字典类型的数据,使用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会有更详细的解说。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容