標籤:swift 同步 非同步通訊 get post
Get是從伺服器上擷取資料,Post是向伺服器傳送資料。對於Get方式,伺服器端用Requset.QueryString擷取變數的值,對於Post方式,伺服器端用Request.Form擷取提交的資料。Get是把參數資料隊列加到提交表單的ACTION屬性所指的URL中,值和表單內個個欄位一一對應,在URL中可以看到。Post是通過HTTP Post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。
Get安全性非常低,Post安全性較高,但是Get方式的執行效率比Post好。
所以建議使用Get做查詢,使用Post做增、刪、改。
在開發戰記第24話中我們使用的同步擷取天氣資訊的方法就是一種Get方式的同步請求,請看以下代碼:
import UIKitclass ViewController: UIViewController { @IBAction func showWeatherJson(sender: UIButton) { //建立url var url:NSURL! = NSURL(string: "http://www.weather.com.cn/adat/sk/101010100.html") //建立請求對象 var urlRequest:NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) //建立響應對象 var response:NSURLResponse? //建立錯誤對象 var error:NSError? //發出請求 var data:NSData? = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: &response, error: &error) if error != nil { println(error?.code) println(error?.description) } else { var jsonString = NSString(data: data!, encoding: NSUTF8StringEncoding) println(jsonString) } }}
這裡建立NSURLRequest對象的時候,使用了一個更加複雜的構造器:
URL參數:請求路徑
cachePolicy參數:緩衝協議
timeoutInterval參數:網路請求逾時時間(單位:秒)
緩衝協議是個枚舉類型:
enum NSURLRequestCachePolicy : UInt { case UseProtocolCachePolicy//基礎策略 case ReloadIgnoringLocalCacheData//忽略本機快取 case ReloadIgnoringLocalAndRemoteCacheData // Unimplemented 無視任何緩衝策略,總是從源地址重新下載 case ReturnCacheDataElseLoad //首先使用緩衝,沒有本機快取,才用源地址下載 case ReturnCacheDataDontLoad //使用本機快取,從不下載,如果沒有本機快取,則請求失敗,此策略多用於離線操作 case ReloadRevalidatingCacheData // Unimplemented 如果本機快取是有效則不下載,其他任何情況都從源地址重新下載}
下面介紹非同步Get請求方式:
func asynchronousGet() { //建立NSURL對象 var url:NSURL! = NSURL(string: "<span style="font-family: Arial, Helvetica, sans-serif;">http://api.hudong.com/iphonexml.do?type=focus-c</span><span style="font-family: Arial, Helvetica, sans-serif;">")//參數直接寫到路徑中</span> //建立請求對象 var urlRequest:NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) //網路連接對象 var conn:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self) }在串連了伺服器之後,使用下面兩個非同步請求的代理方法NSURLConnectionDataDelegate,來接收相關資料。
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) { //接收響應 } var jsonData:NSMutableData = NSMutableData() func connection(connection: NSURLConnection, didReceiveData data: NSData) { //收到資料,此方法根據資料大小執行若干次 jsonData.appendData(data) }
同步Post方法如下,把參數放到HTTP的body中,安全性比較高
import UIKitclass ViewController: UIViewController { @IBAction func showWeatherJson(sender: UIButton) { //建立url var url:NSURL! = NSURL(string: "http://api.hudong.com/iphonexml.do") //建立請求對象 var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) urlRequest.HTTPMethod = "POST"//佈建要求方式為POST,預設為GET var str:String = "type=focus-c"//設定參數 var data:NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! urlRequest.HTTPBody = data //建立響應對象 var response:NSURLResponse? //建立錯誤對象 var error:NSError? //發出請求 var received:NSData? = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: &response, error: &error) if error != nil { println(error?.code) println(error?.description) } else { var jsonString = NSString(data: received!, encoding: NSUTF8StringEncoding) println(jsonString) } }}
非同步Post請求方式如下:
var url:NSURL! = NSURL(string: "http://api.hudong.com/iphonexml.do") //建立請求對象 var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) urlRequest.HTTPMethod = "POST"//佈建要求方式為POST,預設為GET var str:String = "type=focus-c"//設定參數 var data:NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! urlRequest.HTTPBody = data var connection = NSURLConnection(request: urlRequest, delegate: self)
然後就可以在代理方法中進行操作了。
Swift語言IOS8開發戰記25 網路通訊Get和Post方式