一、介紹
Get和Post區別:
- Get是從服務器上獲取數據,Post是向服務器發送數據。
- 對於Get方式,服務端用Request.QueryString獲取變量的值,對於Post方式,服務端用Request.From獲取提交的數據。
- Get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內的各個字段一一對應。
- Post是通過HTTP Post機制,將表單內各個字段和其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
- Get安全性非常低,Post安全性較高;但是Get方式的執行效率比Post方法好。
- Get方式的安全性較Post方式差些,若包含機密信息,則建議用Post數據提交方式。
- 在數據查詢時,建議用Get方式;在做數據添加、刪除、修改時,建議用Post方式。
緩存策略:
public enum CachePolicy : UInt { case useProtocolCachePolicy //基礎策略 case reloadIgnoringLocalCacheData //忽略本地存儲 case reloadIgnoringLocalAndRemoteCacheData // 忽略本地和遠程存儲,總是從原地址下載 case returnCacheDataElseLoad //首先使用緩存,如果沒有就從原地址下載 case returnCacheDataDontLoad //使用本地緩存,從不下載,如果沒有本地緩存,則請求失敗,此策略多用於離線操作 case reloadRevalidatingCacheData // 若本地緩存是有效的則不下載,其他任何情況總是從原地址下載 }
二、示例
Get同步請求:
//MARK: - 同步Get方式 func synchronousGet(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、響應對象 var response:URLResponse? // 4、發出請求 do { let received = try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response) let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) //let jsonStr = String(data: received, encoding:String.Encoding.utf8); //print(jsonStr) } catch let error{ print(error.localizedDescription); } }
Get異步請求:
//在控制器定義全局的可變data,用戶存儲接收的數據 var jsonData:NSMutableData = NSMutableData()
//MARK: - 異步Get方式 func asynchronousGet(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、連接服務器 let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self) connection?.schedule(in: .current, forMode: .defaultRunLoopMode) connection?.start() }
// MARK - NSURLConnectionDataDelegate extension GetPostViewController:NSURLConnectionDataDelegate{ func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { //接收響應 } func connection(_ connection: NSURLConnection, didReceive data: Data) { //收到數據 self.jsonData.append(data); } func connectionDidFinishLoading(_ connection: NSURLConnection) { //請求結束 //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8); //print(jsonStr) do { let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) } catch let error{ print(error.localizedDescription); } } }
Post同步請求:
//MARK: - 同步Post方式 func synchronousPost() { // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、設置請求方式為POST,默認是GET urlRequest.httpMethod = "POST" // 4、設置參數 let str:String = "type=beauty" let data:Data = str.data(using: .utf8, allowLossyConversion: true)! urlRequest.httpBody = data; // 5、響應對象 var response:URLResponse? // 6、發出請求 do { let received = try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response) let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) //let jsonStr = String(data: received, encoding:String.Encoding.utf8); //print(jsonStr) } catch let error{ print(error.localizedDescription); } }
Post異步請求:
//在控制器定義全局的可變data,用戶存儲接收的數據 var jsonData:NSMutableData = NSMutableData()
//MARK: - 異步Post方式 func asynchronousPost(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、設置請求方式為POST,默認是GET urlRequest.httpMethod = "POST" // 4、設置參數 let str:String = "type=beauty" let data:Data = str.data(using: .utf8, allowLossyConversion: true)! urlRequest.httpBody = data; // 5、連接服務器 let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self) connection?.schedule(in: .current, forMode: .defaultRunLoopMode) connection?.start() }
// MARK - NSURLConnectionDataDelegate extension GetPostViewController:NSURLConnectionDataDelegate{ func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { //接收響應 } func connection(_ connection: NSURLConnection, didReceive data: Data) { //收到數據 self.jsonData.append(data); } func connectionDidFinishLoading(_ connection: NSURLConnection) { //請求結束 //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8); //print(jsonStr) do { let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) } catch let error{ print(error.localizedDescription); } } }
三、解析結果
{ body = ( { cThumbnail = "http://d.ifengimg.com/w166_h120/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg"; cid = 1; comments = 0; commentsUrl = "http://share.iclient.ifeng.com/news/sharenews.f?&fromType=spider&aid=301341"; commentsall = 0; content = ""; ctime = "2017-04-01 17:30:01"; id = "shortNews_301341"; img = ( { size = { height = 720; width = 480; }; url = "http://d.ifengimg.com/mw480/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg"; } ); likes = 86; link = { type = shortNews; url = "http://api.iclient.ifeng.com/clientShortNewsDetail?id=301341"; }; praise = 9284; shareTitle = "\U51e4\U51f0\U65b0\U95fb\U7f8e\U5973\U56fe\U7247"; shareUrl = "http://share.iclient.ifeng.com/news/sharenews.f?&fromType=spider&aid=301341"; source = ""; staticImg = ""; status = 1; thumbnail = "http://d.ifengimg.com/w166/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg"; title = "\U51e4\U51f0\U65b0\U95fb\U7f8e\U5973\U56fe\U7247"; tread = 738; type = shortNews; utime = "2017-04-01 17:30:01"; }, { .............. .............. .............. }
四、完整代碼

// // GetPostViewController.swift // NetWorkTest // // Created by 夏遠全 on 2017/4/3. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit class GetPostViewController: UIViewController { //在控制器定義全局的可變data,用戶存儲接收的數據 var jsonData:NSMutableData = NSMutableData() override func viewDidLoad() { super.viewDidLoad() } //========================================Get==========================================// //MARK: - 同步Get方式 func synchronousGet(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、響應對象 var response:URLResponse? // 4、發出請求 do { let received = try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response) let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) //let jsonStr = String(data: received, encoding:String.Encoding.utf8); //print(jsonStr) } catch let error{ print(error.localizedDescription); } } //MARK: - 異步Get方式 func asynchronousGet(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、連接服務器 let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self) connection?.schedule(in: .current, forMode: .defaultRunLoopMode) connection?.start() } //========================================Post==========================================// //MARK: - 同步Post方式 func synchronousPost() { // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、設置請求方式為POST,默認是GET urlRequest.httpMethod = "POST" // 4、設置參數 let str:String = "type=beauty" let data:Data = str.data(using: .utf8, allowLossyConversion: true)! urlRequest.httpBody = data; // 5、響應對象 var response:URLResponse? // 6、發出請求 do { let received = try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response) let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) //let jsonStr = String(data: received, encoding:String.Encoding.utf8); //print(jsonStr) } catch let error{ print(error.localizedDescription); } } //MARK: - 異步Post方式 func asynchronousPost(){ // 1、創建URL對象; let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews"); // 2、創建Request對象 // url: 請求路徑 // cachePolicy: 緩存協議 // timeoutInterval: 網絡請求超時時間(單位:秒) var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10) // 3、設置請求方式為POST,默認是GET urlRequest.httpMethod = "POST" // 4、設置參數 let str:String = "type=beauty" let data:Data = str.data(using: .utf8, allowLossyConversion: true)! urlRequest.httpBody = data; // 3、連接服務器 let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self) connection?.schedule(in: .current, forMode: .defaultRunLoopMode) connection?.start() } } // MARK - NSURLConnectionDataDelegate extension GetPostViewController:NSURLConnectionDataDelegate{ func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { //接收響應 } func connection(_ connection: NSURLConnection, didReceive data: Data) { //收到數據 self.jsonData.append(data); } func connectionDidFinishLoading(_ connection: NSURLConnection) { //請求結束 //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8); //print(jsonStr) do { let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments) print(dic) } catch let error{ print(error.localizedDescription); } } }