精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

自己動手寫一個 iOS 網絡請求庫——封裝接口

移動開發 iOS
本篇文章中,我們將一起嘗試使用一個類來封裝我們之前的代碼,并嘗試加入動態增加 HTTP 參數(params)的功能,之后封裝出一個強大的接口。

代碼示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary

開源項目:Pitaya,適合大文件上傳的 HTTP 請求庫:https://github.com/johnlui/Pitaya

本篇文章中,我們將一起嘗試使用一個類來封裝我們之前的代碼,并嘗試加入動態增加 HTTP 參數(params)的功能,之后封裝出一個強大的接口。

 

[[135523]]

基本封裝

基礎準備

新建一個 Swift 空文件,命名為 Network.swift,在里面寫一個 Network 類,之后寫一個靜態方法 request():

  1. class Network{ 
  2. static func request() { 
  3. let session = NSURLSession.sharedSession() 
  4. let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) 
  5. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  6. println("just wait for 5 seconds!") 
  7. sleep(5) 
  8. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  9. println(string) 
  10. }) 
  11. task.resume() 

修改 ViewController 中的按鈕函數:

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. Network.request() 

運行項目,點擊按鈕,效果和之前一致。

自定義 HTTP method 和 URL

修改 request() 方法,將 HTTP 方法和 URL 傳進去:

  1. static func request(method: String, url: String) { 
  2. let session = NSURLSession.sharedSession() 
  3. let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
  4. request.HTTPMethod = method 
  5. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  6. println("just wait for 5 seconds!"
  7. sleep(5
  8. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  9. println(string) 
  10. }) 
  11. task.resume() 

修改前面的函數調用:

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. Network.request("GET", url: "http://baidu.com"

運行項目,點擊按鈕,效果和之前一致。

使用閉包處理請求結果

函數是 Swift 中的一等公民,閉包可以作為函數參數和返回值,十分強大。下面我們就用閉包來處理網絡請求的返回值。修改 request() 方法,傳遞進去一個閉包:

  1. static func request(method: String, url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let session = NSURLSession.sharedSession() 
  3. let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
  4. request.HTTPMethod = method 
  5. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  6. callback(data: data, response: response , error: error) 
  7. }) 
  8. task.resume() 

在前面函數調用處使用閉包進行結果處理:
 

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. Network.request("GET", url: "http://baidu.com") { (data, response, error) -> Void in 
  3. println("just wait for 5 seconds!"
  4. sleep(5
  5. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  6. println(string) 

運行項目,點擊按鈕,效果和之前一致。

動態增加 Params

GET 方法

GET 方法下,params 在經過 url encode 之后直接附在 URL 末尾發送給服務器。修改 request() 方法,傳遞進去一個 params 的字典:

  1. static func request(method: String, url: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. ... ... 

為了處理 params,我們從 Alamofire 偷來他的 params 處理函數。如果是 GET 方法,那就把處理過的 params 增加到 URL 后面。Network 類的完整代碼如下:
 

  1. class Network{ 
  2. static func request(method: String, url: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  3. let session = NSURLSession.sharedSession() 
  4.  
  5. var newURL = url 
  6. if method == "GET" { 
  7. newURL += "?" + Network().buildParams(params) 
  8.  
  9. let request = NSMutableURLRequest(URL: NSURL(string: newURL)!) 
  10. request.HTTPMethod = method 
  11.  
  12. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  13. callback(data: data, response: response , error: error) 
  14. }) 
  15. task.resume() 
  16.  
  17. // 從 Alamofire 偷了三個函數 
  18. func buildParams(parameters: [String: AnyObject]) -> String { 
  19. var components: [(String, String)] = [] 
  20. for key in sorted(Array(parameters.keys), [(String, String)] { 
  21. var components: [(String, String)] = [] 
  22. if let dictionary = value as? [String: AnyObject] { 
  23. for (nestedKey, value) in dictionary { 
  24. components += queryComponents("\(key)[\(nestedKey)]", value) 
  25. else if let array = value as? [AnyObject] { 
  26. for value in array { 
  27. components += queryComponents("\(key)", value) 
  28. else { 
  29. components.extend([(escape(key), escape("\(value)"))]) 
  30.  
  31. return components 
  32. func escape(string: String) -> String { 
  33. let legalURLCharactersToBeEscaped: CFStringRef = ":&=;+!@#$()',*" 
  34. return CFURLCreateStringByAddingPercentEscapes(nil, string, nil, legalURLCharactersToBeEscaped, CFStringBuiltInEncodings.UTF8.rawValue) as String 

修改前面的函數調用:

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. Network.request("GET", url: "http://pitayaswift.sinaapp.com/pitaya.php", params: ["get""Network"]) { (data, response, error) -> Void in 
  3. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  4. println(string) 

http://pitayaswift.sinaapp.com/pitaya.php 是我部署的用于測試的服務端代碼,會直接返回 ?get=ooxx 中的 ooxx。運行項目,點擊按鈕,查看效果:

POST 方法

POST 方法下有幾個協議可供選擇,此處沒有文件上傳,我們采用較簡單的 application/x-www-form-urlencoded 方式發送請求。request() 方法增加一些代碼:

  1. static func request(method: String, url: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let session = NSURLSession.sharedSession() 
  3.  
  4. var newURL = url 
  5. if method == "GET" { 
  6. newURL += "?" + Network().buildParams(params) 
  7.  
  8. let request = NSMutableURLRequest(URL: NSURL(string: newURL)!) 
  9. request.HTTPMethod = method 
  10.  
  11. if method == "POST" { 
  12. request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type"
  13. request.HTTPBody = Network().buildParams(params).dataUsingEncoding(NSUTF8StringEncoding) 
  14.  
  15. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  16. callback(data: data, response: response , error: error) 
  17. }) 
  18. task.resume() 

修改前面的函數調用:

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. Network.request("POST", url: "http://pitayaswift.sinaapp.com/pitaya.php", params: ["post""Network"]) { (data, response, error) -> Void in 
  3. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  4. println(string) 

使用 POST 方式發送請求,同樣服務端會返回 key 為 post 的 value 的值。運行項目,點擊按鈕,結果和前面 GET 方法的結果一致。

至此,接口封裝完成!

責任編輯:chenqingxiang 來源: 呂文翰_JohnLui 的博客
相關推薦

2015-06-02 10:24:43

iOS網絡請求降低耦合

2015-06-02 09:41:00

iOS網絡請求NSURLSessio

2017-03-02 13:31:02

監控系統

2023-12-16 13:21:00

Python元類ORM

2024-12-06 09:58:09

2020-09-29 12:13:46

SQL引擎底層

2017-02-14 10:20:43

Java Class解析器

2015-07-23 14:53:50

貝葉斯分類器

2014-11-26 10:54:20

C#

2021-02-22 17:17:38

Proxy緩存代碼

2023-12-15 10:14:42

數據庫select語句

2021-07-04 10:07:04

Virtual DO閱讀源碼虛擬DOM

2018-04-08 11:20:43

深度學習

2024-03-08 12:45:00

C#Web服務器

2018-02-07 10:46:20

數據存儲

2018-09-12 10:58:11

NBA數據存儲

2022-08-29 14:22:03

bpmn.jsVue流程

2021-04-26 07:31:22

SpringMVCweb框架

2012-07-30 09:40:52

Lua

2022-03-09 09:43:01

工具類線程項目
點贊
收藏

51CTO技術棧公眾號

97人妻天天摸天天爽天天| 久久久久99| 国产黑丝在线一区二区三区| 日韩精品高清视频| 国产综合香蕉五月婷在线| 久久久久国产免费| 成人免费在线电影| 国产欧美三级电影| 国产精品传媒在线| 欧美自拍视频在线| 最新日本中文字幕| 久久人体大尺度| 成人av资源网站| 美日韩精品视频免费看| 亚洲污视频在线观看| 日本人妻熟妇久久久久久| 欧美国产先锋| 欧美一区二区三区日韩| 色99中文字幕| 一级黄色免费网站| 亚洲视频国产| 综合电影一区二区三区| 国产精品一区专区欧美日韩| 国产免费看av| 成人福利视频| 一区二区三区免费网站| 91久久久一线二线三线品牌| 日韩黄色免费观看| 精品国产乱码一区二区三区| 成人免费在线播放视频| 欧美精品一区在线| 高潮毛片又色又爽免费| 国产麻豆一区二区三区| 亚洲麻豆国产自偷在线| 超碰国产精品久久国产精品99| www.毛片com| 亚洲一区二区电影| 欧美日韩黄视频| 日韩视频在线免费播放| 国产不卡av在线播放| 欧美日本三区| 亚洲精品电影网在线观看| 黄色动漫在线免费看| 欧美色综合一区二区三区| 久久字幕精品一区| 日韩一区二区久久久| 色网站在线视频| а_天堂中文在线| 久久日韩粉嫩一区二区三区| 国产精品视频网站| 欧美成人精品激情在线视频| 欧美国产美女| 欧美成人免费网站| 欧美亚洲另类色图| 日本乱码一区二区三区不卡| 中文字幕免费在线观看视频一区| 成人亲热视频网站| 国产一级做a爱免费视频| 欧美男男gaytwinkfreevideos| 欧美三级蜜桃2在线观看| 老汉色影院首页| 亚洲av成人无码网天堂| 日本亚洲欧美天堂免费| 欧美精品一区二区三区国产精品| 欧美巨胸大乳hitomi| 91成人噜噜噜在线播放| 欧美大片在线观看一区二区| 9久久9毛片又大又硬又粗| 亚洲搞黄视频| 97se狠狠狠综合亚洲狠狠| 国产精品成久久久久三级| 91日韩中文字幕| 综合国产精品| 亚洲日本中文字幕| www.四虎精品| 鲁大师精品99久久久| 欧美久久久久久久久中文字幕| 日韩av新片网| 黄色大片在线播放| 2024国产精品| 日本精品一区| 日本精品一二区| 2020国产精品| 亚洲国产日韩美| 欧美孕妇性xxxⅹ精品hd| 美女任你摸久久| 欧美又大粗又爽又黄大片视频| 男人操女人的视频网站| 精品91视频| 欧美理论电影在线播放| 欧美成人短视频| 欧美阿v一级看视频| 8050国产精品久久久久久| 欧美人妻精品一区二区免费看| 日韩免费高清| 亚洲人成电影网站| 在线免费看av网站| 91中文字幕精品永久在线| 久久99热精品| 波多野结衣视频观看| 国产精品影视天天线| 成人黄色免费看| 日韩一级在线播放| 国产精品拍天天在线| 日本一区二区三区视频在线播放| 国产在线高潮| 色综合一区二区| av免费观看网| 色资源二区在线视频| 欧美日韩中文字幕一区二区| 色悠悠在线视频| 99视频精品全部免费在线视频| 在线观看亚洲视频| 国产精品久久久久久久av| 免费一区二区| 欧美激情中文网| 国产真实乱人偷精品视频| 日本不卡的三区四区五区| 国产亚洲精品自在久久| 日本wwwxxxx| 中文字幕在线观看一区| 18禁男女爽爽爽午夜网站免费| 在线看片福利| 色香色香欲天天天影视综合网| 国内av免费观看| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 免费一级欧美在线观看视频| 精品国产乱码久久久久久婷婷| 国产精品视频网站在线观看 | 中文字幕一区二区三区在线不卡 | 青娱乐精品视频在线| 国产尤物91| 免费网站在线观看人| 亚洲一区二区综合| 9久久9毛片又大又硬又粗| 欧美三级一区| 久久精品福利视频| 欧美激情国产精品免费| 久久精品99国产国产精| 成人免费在线视频网站| 免费a级毛片在线观看| 亚洲国产精品综合小说图片区| 欧美,日韩,国产在线| 91综合精品国产丝袜长腿久久| 亚洲成色www8888| 星空大象在线观看免费播放| 久久99久久人婷婷精品综合| 国外色69视频在线观看| 精品国产乱子伦| 91浏览器在线视频| 日韩高清国产精品| 日本福利在线| 亚洲人成网站影音先锋播放| 日韩欧美猛交xxxxx无码| 亚洲日本中文| 久久精品国产96久久久香蕉| 国产伦精品一区二区三区视频痴汉| 粉嫩嫩av羞羞动漫久久久| 日本中文不卡| 国产精品美女午夜爽爽| 亚洲一区二区久久| 久久午夜无码鲁丝片| 久久资源在线| 色一情一区二区三区四区| 在线成人视屏| 精品日韩成人av| 久久久久久久伊人| 99re热这里只有精品免费视频| 久草热视频在线观看| 中文字幕av一区二区三区人| 美女久久久久久久久久久| www.蜜臀av| 欧美国产精品v| 奇米影视四色在线| 香蕉久久夜色精品国产更新时间 | eeuss中文字幕| 久久66热re国产| 精品日韩美女| av官网在线播放| 欧美亚洲动漫精品| 三级视频网站在线观看| 国产精品日韩| 亚洲一区二区三区四区在线播放| 国产中文在线| 欧美日韩国产专区| 韩国一区二区三区四区| 日韩精品一区二区三区免费观影| 成人黄色激情网| av福利导福航大全在线| 日韩视频一区在线观看| 99国产精品无码| 日韩影院在线观看| 蜜桃传媒视频麻豆第一区免费观看 | 久久精品九色| 91成人精品网站| 男人天堂久久久| 日韩电影中文字幕在线| 中文字幕乱码人妻无码久久| 91在线精品一区二区三区| 婷婷激情四射五月天| 激情综合视频| 一区二区精品免费视频| 精品美女一区| 午夜精品福利在线观看| 蜜臀av在线观看| 在线观看www91| 永久免费毛片在线观看| 久久精品人人做人人爽电影蜜月| 久久免费看毛片| 午夜不卡一区| 久久精品久久久久久| 性猛交xxxx| 欧美一区国产二区| 国产一卡二卡三卡| 亚洲国产成人高清精品| 亚洲天堂网av在线| 狠狠色狠狠色合久久伊人| 伊人久久青草| 自拍视频一区| 国产区一区二区| 国产va免费精品观看精品| 青青久久av北条麻妃海外网| 波多野结依一区| 操日韩av在线电影| www.污视频| 欧美日韩精品一区二区三区蜜桃| 精品人妻一区二区三区免费看| 久久色在线视频| 中文字幕精品久久久| 国产精品白丝jk黑袜喷水| 日韩av在线中文| 日韩综合小视频| 黄色网页免费在线观看| 亚洲午夜一区| 欧美久久综合性欧美| 成人资源在线播放| 成人网在线免费看| 成人国产一区二区三区精品麻豆| 久久资源免费视频| 色老头视频在线观看| 在线观看欧美成人| 成人精品福利| 一区二区成人精品| 国产福利在线观看| 日韩网站在线看片你懂的| 国产又黄又粗又猛又爽| 欧美日本一区二区| 中文字幕在线观看视频一区| 欧美三级中文字| 亚洲怡红院av| 亚洲成人激情av| 国产小视频在线看| 亚洲午夜激情网页| 亚洲国产精品午夜在线观看| 亚洲国产精品激情在线观看 | 青青视频一区二区| 国产精品一区二区久久久久| 日本精品裸体写真集在线观看| 国产成人一区二区| av片哪里在线观看| 久久亚洲精品小早川怜子66| 91亚洲天堂| 欧美精品久久久久久久久久| 6699嫩草久久久精品影院| 97久久精品国产| 美女一区网站| 国产精品偷伦免费视频观看的| 成人免费91| 国产精品久久久久久久天堂第1集| 日韩欧美精品一区二区综合视频| 日本精品免费一区二区三区| 色呦呦视频在线观看| 国产亚洲欧美另类中文| 午夜视频在线看| 蜜臀久久99精品久久久久久宅男 | 日本精品久久中文字幕佐佐木| 欧美日韩尤物久久| 91免费看片在线| 成人性生活视频| 国产精品老女人精品视频| 成人在线视频www| 国产综合 伊人色| 成人看的视频| 欧美日韩系列| 欧美第一精品| 美女黄色免费看| 日韩电影在线观看一区| 欧美性受xxxx黒人xyx性爽| av一区二区不卡| 免费啪视频在线观看| ww久久中文字幕| 久久精品一区二区三区四区五区| 亚洲国产欧美日韩另类综合| 国产精品午夜一区二区| 一本色道a无线码一区v| 中文字幕在线观看1| 亚洲福利在线视频| 亚洲成人三级| 欧美在线www| 久久99成人| 午夜精品电影在线观看| 日韩天堂av| 免费一级特黄毛片| 蜜桃av一区二区三区电影| 欧美性生交xxxxx| 中文字幕中文字幕一区二区| 999这里只有精品| 欧美午夜视频在线观看| 五月天综合激情网| 91精品国产入口在线| 激情小说 在线视频| 欧美激情一区二区三区在线视频观看 | wwwxxxx在线观看| 久久99热国产| 亚洲专区区免费| 国产欧美日韩三级| 国产91丝袜美女在线播放| 亚洲一区二区三区中文字幕| 91 中文字幕| 日韩欧美精品三级| 97最新国自产拍视频在线完整在线看| 中文字幕国产日韩| 麻豆tv入口在线看| 国产福利精品在线| 天天躁日日躁狠狠躁欧美巨大小说| 潘金莲一级淫片aaaaaa播放1| 日韩电影在线观看电影| 亚洲永久精品ww.7491进入| 亚洲欧美二区三区| 一级片一区二区三区| 一区二区三区四区视频| 欧美自拍电影| 成人免费看吃奶视频网站| 国产欧美日韩在线一区二区| 亚洲欧美电影在线观看| 久久精品首页| 男生草女生视频| 色综合久久久久综合体| 涩涩视频在线观看免费| 韩国日本不卡在线| 国产精品白丝一区二区三区| 福利在线一区二区| 国产传媒一区在线| 欧美成人精品激情在线视频| 宅男噜噜噜66一区二区66| 日韩中文字幕免费观看| 欧美日本国产在线| 亚洲综合影院| 丁香六月激情婷婷| 日韩一区精品视频| 日韩乱码人妻无码中文字幕久久| 日韩欧美视频一区二区三区| 日韩a在线观看| 日本国产一区二区三区| 九九综合九九| www.日日操| 丁香婷婷综合激情五月色| 精品国产无码在线观看| 91国产免费看| 丰满大乳国产精品| 深夜福利一区二区| 黄色软件视频在线观看| 国产在线视频91| 亚洲国产一成人久久精品| 欧美 日韩精品| 国产免费成人在线视频| 中文字幕一区二区三区四区视频| www日韩欧美| 欧一区二区三区| 亚洲精品欧美精品| 国产一区二区视频在线播放| 瑟瑟视频在线观看| 欧美色大人视频| 天天色天天射天天综合网| 国产综合精品一区二区三区| 蘑菇福利视频一区播放| 激情无码人妻又粗又大| 日韩欧美二区三区| 深夜成人在线| 一区二区三区我不卡| 高清在线不卡av| 中文字幕精品视频在线观看| 久久精品99久久香蕉国产色戒| 国产成人澳门| 在线免费视频一区| 一二三四区精品视频| 国产最新视频在线| 91手机在线观看| 日日摸夜夜添夜夜添国产精品 | 亚洲成人免费| 在线观看av中文字幕| 亚洲一二三区视频在线观看| 理论视频在线| 亚洲在线第一页| 久久看片网站| 久久精品一区二区三| 在线中文字幕日韩| 国产一区丝袜| 亚洲妇熟xx妇色黄蜜桃| 一色桃子久久精品亚洲|