Swift語言IOS8開發戰記25 網路通訊Get和Post方式

來源:互聯網
上載者:User

標籤: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方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.