Alamofire使用詳解

一萨驶,Alamofire的說明與配置

1为流,什么是Alamofire

?(1)Alamofire的前身是AFNetworking忆植。AFNetworking是iOS和OS X上很受歡迎的第三方HTTP網(wǎng)絡(luò)基礎(chǔ)庫泣港。

(2)其實AFNetwork的前綴AF便是Alamofire的縮寫骑歹。

(3)Swift發(fā)布后,AFNetworking的作者又用Swift語言寫了個相同功能的庫坞淮,這便是Alamofire茴晋。

(4)Alamofire本質(zhì)是基于`URLSession`,并做了封裝碾盐。使用Alamofire可以讓我們網(wǎng)絡(luò)請求相關(guān)代碼(如獲取數(shù)據(jù)晃跺,提交數(shù)據(jù),上傳文件毫玖,下載文件等)更加簡潔易用掀虎。

? ?關(guān)于Cookie:

Alamofire是基于URLRequest封裝的,所以Cookie會自動保存付枫,就和瀏覽器請求是一個效果烹玉。而且網(wǎng)站Set_cookie多久,本地的Cookie就多久阐滩,每次請求的時候都會自動帶上cookie二打,直到過期。(所以像登陸session這些的都不用我們手動去處理)

2掂榔,Alamofire的功能特性:

(1)鏈?zhǔn)降恼埱?響應(yīng)方法

(2)URL / JSON / plist參數(shù)編碼

(3)上傳類型支持:文件(File?)继效、數(shù)據(jù)(Data?)、流(Stream)以及MultipartFormData

(4)支持文件下載装获,下載支持?jǐn)帱c續(xù)傳

(5)支持使用NSURLCredential進(jìn)行身份驗證

(6)HTTP響應(yīng)驗證

(7)TLS Certificate and Public Key Pinning

(8)Progress Closure & NSProgress

3瑞信,Alamofire的安裝與配置

(1)從GitHub上下載最新的代碼

(2)最后,在需要使用Alamofire的地方import進(jìn)來就可以了 : import ?Alamofire

二穴豫,使用Alamofire進(jìn)行數(shù)據(jù)請求

1凡简,以GET請求為例

(1)不帶參數(shù)逼友,不帶結(jié)果處理

? ? ? Alamofire.request("https://httpbin.org/get")

(2)帶參數(shù),不帶結(jié)果處理

? ? ?Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

(3)帶參數(shù)秤涩,也帶結(jié)果處理(這里以返回結(jié)果為json格式的為例)

? ?Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

.responseJSON { responsein

print(response.request)// original URL request

print(response.response)// URL response

print(response.data)// server data

print(response.result)// result of response serialization

ifletJSON= response.result.value {

print("JSON: \(JSON)")//具體如何解析json內(nèi)容可看下方“響應(yīng)處理”部分

}

}

2帜乞,響應(yīng)處理(Response Handling)

(1)除了上面樣例使用的responseJSON(處理json類型的返回結(jié)果)外,Alamofire還提供了許多其他類型的響應(yīng)處理方法:

response()

responseData()

responseString(encoding: NSStringEncoding)

responseJSON(options: NSJSONReadingOptions)

responsePropertyList(options: NSPropertyListReadOptions)

(2)Response Handler

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

.response { responsein

print("Request: \(response.request)")

print("Response: \(response.response)")

print("Error: \(response.error)")

if ?let ? data = response.data, letutf8Text =String(data: data, encoding: .utf8) {

print("Data: \(utf8Text)")

}

}

(3)Response Data Handler

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

.responseData { responsein

debugPrint("All Response Info: \(response)")

if let data = response.result.value,letutf8Text =String(data: data, encoding: .utf8) {

print("Data: \(utf8Text)")

}

}

(4)Response String Handler

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

.responseString { responsein

print("Success: \(response.result.isSuccess)")

print("Response String: \(response.result.value)")

}

(5)Response JSON Handler

使用responseJSON 方法的話筐眷,JSON數(shù)據(jù)會被自動轉(zhuǎn)化為 Dictionary或Array黎烈。假設(shè)我們返回的json數(shù)據(jù)格式如下:

[

{

"name": "hangge",

"phones": [

{

"name": "公司",

"number": "123456"

},

{

"name": "家庭",

"number": "001"

}

]

},

{

"name": "big boss",

"phones": [

{

"name": "公司",

"number": "111111"

}

]

}

]

使用responseJSON自動解析json數(shù)據(jù):

Alamofire.request("http://www.hangge.com/jsonData.php")

.responseJSON { responsein

switch response.result.isSuccess {

case ?true:

//把得到的JSON數(shù)據(jù)轉(zhuǎn)為數(shù)組

if let items = response.result.valueas?NSArray{

//遍歷數(shù)組得到每一個字典模型

for dict in ?items{

print(dict)

}

}

casefalse:

print(response.result.error)

}

}

(6)同樣也支持鏈?zhǔn)降姆祷亟Y(jié)果處理

Alamofire.request("https://httpbin.org/get")

.responseString { responsein

print("Response String: \(response.result.value)")

}

.responseJSON { responsein

print("Response JSON: \(response.result.value)")

}

3,請求類型(HTTP Methods)

除了上面使用的.Get類型(不指定的話浊竟,默認(rèn)都是使用Get請求)怨喘。Alamofire還定義了許多其他的HTTP 方法(HTTP Medthods)可以使用。

public enum ?HTTPMethod:String{

caseoptions ="OPTIONS"

caseget="GET"

casehead??? ="HEAD"

casepost??? ="POST"

caseput???? ="PUT"

casepatch?? ="PATCH"

casedelete? ="DELETE"

casetrace?? ="TRACE"

caseconnect ="CONNECT"

}

比如要使用POST請求振定,把Alamofire.request第二個參數(shù)做修改即可:

?Alamofire.request("http://httpbin.org/post", method: .post)

4,請求參數(shù)(Parameters)

(1)使用GET類型請求的時候肉拓,參數(shù)會自動拼接在url后面

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

//https://httpbin.org/get?foo=bar

(2)使用POST類型請求的時候后频,參數(shù)是放在在HTTP body里傳遞,url上看不到

letparameters:[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暖途,參數(shù)編碼方式(Parameter Encoding)

除了默認(rèn)的方式外卑惜,Alamofire還支持URL、JSON驻售、PropertyList以及自定義格式方式編碼參數(shù)露久。

比如我們想要把一個字典類型的數(shù)據(jù),使用json格式發(fā)起POST請求:

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"}}

服務(wù)端php頁面可以這么取得發(fā)送過來的JSON數(shù)據(jù):

$postdata= json_decode(file_get_contents("php://input"),TRUE);

$foo=$postdata["foo"];

foreach($fooas$item){

echo$item."|";

}

//輸出:1|2|3|

6欺栗,支持自定義Http頭信息(HTTP Headers)

let headers:HTTPHeaders= [

"Authorization":"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",

"Accept":"application/json"

]

Alamofire.request("https://httpbin.org/headers", headers: headers)

.responseJSON { responsein

debugPrint(response)

}

三毫痕,判斷數(shù)據(jù)請求是否成功,并做相應(yīng)的處理

在請求響應(yīng)對象之前調(diào)用的.validate()函數(shù)是另一個易用的 Alamofire 特性迟几。

將其與請求和響應(yīng)鏈接消请,以確認(rèn)響應(yīng)的狀態(tài)碼在默認(rèn)可接受的范圍(200到299)內(nèi)。如果認(rèn)證失敗类腮,響應(yīng)處理方法將出現(xiàn)一個相關(guān)錯誤臊泰,我們可以根據(jù)不同在完成處理方法中處理這個錯誤。

比如下面的樣例蚜枢,成功時會打印成功信息缸逃,失敗時輸出具體錯誤信息。

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

.validate()

.responseJSON { responsein

switchresponse.result.isSuccess {

casetrue:

print("數(shù)據(jù)獲取成功!")

casefalse:

print(response.result.error)

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厂抽,一起剝皮案震驚了整個濱河市需频,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌修肠,老刑警劉巖贺辰,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡饲化,警方通過查閱死者的電腦和手機(jī)莽鸭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吃靠,“玉大人硫眨,你說我怎么就攤上這事〕部椋” “怎么了礁阁?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長族奢。 經(jīng)常有香客問我姥闭,道長,這世上最難降的妖魔是什么越走? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任棚品,我火速辦了婚禮,結(jié)果婚禮上廊敌,老公的妹妹穿的比我還像新娘铜跑。我一直安慰自己,他們只是感情好骡澈,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布锅纺。 她就那樣靜靜地躺著,像睡著了一般肋殴。 火紅的嫁衣襯著肌膚如雪囤锉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天疼电,我揣著相機(jī)與錄音嚼锄,去河邊找鬼。 笑死蔽豺,一個胖子當(dāng)著我的面吹牛区丑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播修陡,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼沧侥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了魄鸦?” 一聲冷哼從身側(cè)響起宴杀,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拾因,沒想到半個月后旺罢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旷余,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年扁达,在試婚紗的時候發(fā)現(xiàn)自己被綠了正卧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡跪解,死狀恐怖炉旷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叉讥,我是刑警寧澤窘行,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站图仓,受9級特大地震影響罐盔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜救崔,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一翘骂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帚豪,春花似錦、人聲如沸草丧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌执。三九已至烛亦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂拾,已是汗流浹背煤禽。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留岖赋,地道東北人檬果。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像唐断,于是被迫代替她去往敵國和親选脊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容