Swift語言IOS8開發戰記25 網絡通信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 UIKit

class 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 UIKit

class 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)

然後就可以在代理方法中進行操作了。




發佈了143 篇原創文章 · 獲贊 191 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章