Swift中的HTTP請求
iOS開發中大部分App的網絡數據交換是基於HTTP
協議的。本文將簡單介紹在Swift中使用HTTP進行網絡請求的幾種方法。
注意:網絡請求完成後會獲得一個
NSData
類型的返回數據,如果數據格式爲JSON
,那麼可以使用系統自帶的NSJSONSerialization
類來解析數據;或者使用SwiftyJSON庫的使用和思考一文中提到的JSON解析庫來解析數據。
1. 使用NSURLConnection
下面例子使用NSURLConnection
實現了一個簡單的異步GET操作:
func requestUrl(urlString: String){
var url: NSURL = NSURL(string: urlString)
let request: NSURLRequest = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{
(response, data, error) -> Void in
if error? {
//Handle Error here
}else{
//Handle data in NSData type
}
})
}
2. 使用YYHRequest-Swift庫
這個庫通過封裝NSURLConnection
和NSOperationQueue
實現了簡單的HTTP
GET/POST/PUT/DELETE操作:
let request = YYHRequest(url: NSURL(string: "http://www.google.com/"))
request.loadWithCompletion { response, data, error in
// request complete!
}
3. 使用SwiftHTTP庫。
這個庫通過封裝NSURLSession
,提供了GET/POST/PUT/DELETE以及上傳和下載的支持,比較全面:
var request = HTTPTask()
request.GET("http://vluxe.io", parameters: nil, success: {(response: AnyObject?) -> Void in
},failure: {(error: NSError) -> Void in
})
4. 使用Objective-C中的AFNetworking網絡庫
AFNetworking
庫是在iOS開發領域享有盛名、功能強大的網絡請求庫。
- 首先將AFNetworking庫引入工程,請參考這篇教程
- 然後在
<ProjectName>-Bridging-Header.h
頭文件中引入AFNetworking:
#import “AFNetworking/AFNetworking.h”
下面簡單展示了AFNetworking
中GET
的用法:
func requestUrl(urlString: String) {
let manager = AFHTTPRequestOperationManager()
let params = ["a":1, "b":2]
manager.GET(urlString,
parameters: params,
success: { (operation: AFHTTPRequestOperation!,
responseObject: AnyObject!) in
let responseDict = responseObject as NSDictionary!
},
failure: { (operation: AFHTTPRequestOperation!,
error: NSError!) in
//Handle Error
})
}
實例
最後,我寫了一個簡單的例子來通過調用金山詞霸的API獲取單詞swift
的解釋。項目使用SwiftHTTP
來作網絡請求,使用SwiftyJSON
來解析JSON數據,代碼託管在Github,核心代碼如下:
//請求金山詞霸API獲取單詞`swift`的解釋
var request = HTTPTask()
var params: Dictionary<String, AnyObject> = ["w": "swift", "key": "30CBA9DDD34B16DB669A9B214C941F14", "type": "json"]
request.GET("http://dict-co.iciba.com/api/dictionary.php", parameters: params, success: {(response: AnyObject?) -> Void in
let json = JSONValue(response!)
println("\(json)")
},failure: {(error: NSError) -> Void in
println("\(error)")
})