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)
然後就可以在代理方法中進行操作了。