一萨驶,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)
}