精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

韩剧1988免费观看全集| 一区二区久久久久久| 国产成人在线播放| 亚欧精品视频一区二区三区| 亚洲精品三区| 一区二区三区日本| 欧美在线日韩精品| 91原创国产| 熟妇高潮一区二区| 成人性生交大片免费网站 | 狠狠久久五月精品中文字幕| 亚洲一区二区三区色| 亚洲精品97久久中文字幕无码| 亚洲精品孕妇| 日韩在线观看免费全| 黄色激情在线观看| 亚洲香蕉久久| 色婷婷精品久久二区二区蜜臂av| 中文字幕日韩一区二区三区| 天天摸天天干天天操| 精品在线免费视频| 欧美最猛性xxxxx免费| 外国一级黄色片| 精品香蕉视频| 日韩精品在线看| 97久久国产精品| 五月天男人天堂| 免费黄色在线视频网站| 狠狠狠色丁香婷婷综合久久五月| 欧美在线视频在线播放完整版免费观看| www.4hu95.com四虎| 欧美黑白配在线| 日韩欧美一区二区三区在线| 成人黄色片视频| av片哪里在线观看| 中文字幕在线一区二区三区| 久久久久欧美| 免费观看国产视频| 国产福利精品导航| 91在线无精精品一区二区| 亚洲GV成人无码久久精品| 国产精品观看| 欧美放荡办公室videos4k| 亚洲欧洲综合网| 成人嫩草影院| 中文字幕久热精品视频在线| 成人午夜福利一区二区| 日韩欧美四区| 亚洲加勒比久久88色综合 | 成人免费毛片片v| 99理论电影网| www.蜜臀av| 国产激情精品久久久第一区二区 | 久久亚洲a v| 午夜国产福利在线| 国产精品理伦片| 亚洲欧洲一区二区在线观看| 成人免费在线电影| 中文字幕精品一区二区精品绿巨人 | 国产午夜精品久久| 日本在线观看不卡| 国产高清在线| 成人免费一区二区三区视频| 亚洲 欧洲 日韩| 91最新在线视频| 亚洲第一在线综合网站| 久久久久久人妻一区二区三区| 欧美四级在线| 精品国产乱码久久久久久虫虫漫画 | 国产精品边吃奶边做爽| 亚洲最好看的视频| 国产香蕉一区二区三区在线视频 | 精品三级久久久久久久电影聊斋| 久久九九久久九九| 一本一道久久a久久综合精品| 91网在线播放| 一区二区在线观看免费视频播放| 精品国偷自产一区二区三区| 成人在线黄色电影| 欧洲精品一区二区| 九九热精品国产| 4438全国亚洲精品观看视频| 日韩av在线看| www.4hu95.com四虎| 91精品国产乱码久久久久久| 欧美二区乱c黑人| 亚洲九九九在线观看| www.四虎精品| 国产欧美日韩精品高清二区综合区| 色av中文字幕一区| 久草视频在线资源站| 国产视频亚洲| 国产在线拍偷自揄拍精品| 亚洲国产福利视频| 国产视频一区不卡| 亚洲一区 在线播放| 九九色在线视频| 日韩欧美国产激情| 特级西西444www| 天堂俺去俺来也www久久婷婷| 在线色欧美三级视频| 欧美人妻一区二区| 蜜桃久久av一区| 国产精品久久久久免费| av在线之家电影网站| 亚洲综合色在线| 波多野结衣xxxx| 国产精品x8x8一区二区| 日韩性xxxx爱| 亚洲国产成人无码av在线| 国产一区在线观看视频| 欧美一区二区高清在线观看| 欧洲成人综合网| 欧美日本国产一区| 美女久久久久久久久久| 欧美国产高清| 亚洲专区中文字幕| 幼a在线观看| 日韩欧美亚洲范冰冰与中字| 特黄特色免费视频| 久久中文字幕av一区二区不卡| 97超级碰碰碰| 国产极品久久久| 中文字幕一区二区三| 国产麻花豆剧传媒精品mv在线| 免费观看亚洲视频大全| 色av中文字幕一区| 亚洲视频中文字幕在线观看| 久久青草欧美一区二区三区| 国产一线二线三线女| 性活交片大全免费看| 巨大黑人极品videos精品| 亚洲精品中文字幕女同| 国产精彩视频在线观看| 国产成人午夜电影网| 伊人久久av导航| 久久久久久久少妇| 亚洲电影一区| 啊v视频在线一区二区三区| 国产一级免费视频| 成人av在线资源| 黄色一级大片免费| 久久国际精品| 精品国产拍在线观看| 国产精品国产精品国产| 99久久99久久免费精品蜜臀| 大伊香蕉精品视频在线| 亚洲国产一区二区三区网站| 色妞久久福利网| 中文字幕人妻精品一区| 日本一区二区三区dvd视频在线| 日日碰狠狠添天天爽超碰97| 免费看日产一区二区三区| 自拍偷拍亚洲在线| 亚洲天堂狠狠干| 国产精品国产馆在线真实露脸| 日韩视频免费在线播放| 精品高清久久| 国产精品自产拍在线观| 欧美日韩视频在线播放| 91麻豆精品国产| 手机在线免费看毛片| 国产一区二区不卡| 日韩精品在线观看av| 国产精品色呦| 欧亚精品在线观看| yourporn在线观看中文站| 欧美性大战久久久久久久蜜臀| www.日本高清视频| 国内一区二区在线| 欧美日韩激情四射| 日韩高清在线免费观看| 日本一区二区三区四区视频| 国产免费永久在线观看| 欧美人与z0zoxxxx视频| 久久久久久久久久久久av| 欧美丰满熟妇bbbbbb| 国产成人午夜99999| 天堂…中文在线最新版在线| 成年人精品视频| 天天操天天摸天天舔| 久久99国产精品尤物| 欧美xxxx吸乳| 国产欧美一区二区三区米奇| 欧洲亚洲在线视频| 在线免费观看的av网站| 日韩欧美国产成人一区二区| 精品一区二区三区四| 久久日一线二线三线suv| 色www免费视频| 黄色成人在线网址| 青青成人在线| 欧美电影在线观看一区| 欧美一区二区影院| 哥也色在线视频| 日韩成人在线电影网| 成人黄色免费网| 亚洲国产精品人人做人人爽| 微拍福利一区二区| 国产91精品露脸国语对白| 成人观看免费完整观看| 永久亚洲成a人片777777| 久久精品综合一区| 国产视频一区二| 日av在线播放中文不卡| a级影片在线| 亚洲图片制服诱惑| 蜜桃视频污在线观看| 欧美日韩另类一区| 精品国产免费观看| 亚洲黄一区二区三区| 五月天精品视频| 国产精品一二三在| 日本爱爱免费视频| 亚洲精选国产| 日韩精品福利片午夜免费观看| 亚洲精品亚洲人成在线| 高清国语自产拍免费一区二区三区| 日本h片久久| 69影院欧美专区视频| 91麻豆免费在线视频| 在线播放国产精品| 深夜福利在线观看直播| 欧美成人猛片aaaaaaa| 亚洲特级黄色片| 精品视频一区 二区 三区| 四虎成人永久免费视频| 亚洲成人1区2区| 亚洲精品中文字幕女同| 免费污污视频在线观看| 欧美日韩亚洲91| 日韩精品――中文字幕| 亚洲综合久久久久| 91嫩草|国产丨精品入口| 国产精品美女视频| 美女100%露胸无遮挡| 国产性天天综合网| 少妇久久久久久久久久| 久久精品一区二区三区不卡牛牛| 美女又爽又黄免费| 91在线视频观看| 熟女少妇一区二区三区| www国产成人| 国产亚洲无码精品| 91啪九色porn原创视频在线观看| 成人在线视频免费播放| 97久久超碰国产精品| 精品国产av色一区二区深夜久久| 粉嫩欧美一区二区三区高清影视| 性猛交╳xxx乱大交| 国产成人在线影院| 免费不卡的av| aaa欧美色吧激情视频| 国产精品久久不卡| 91蝌蚪porny九色| 亚洲专区区免费| 久久久高清一区二区三区| 天天干天天色天天爽| 中文字幕人妻一区二区| 大胆亚洲人体视频| 久久久久久久穴| 91在线免费视频观看| www.日本高清| 国产网站一区二区三区| 自拍偷拍视频亚洲| 国产农村妇女精品| 亚洲a∨无码无在线观看| 欧美国产成人在线| 摸摸摸bbb毛毛毛片| 国产亚洲精品bt天堂精选| 四虎影视一区二区| 依依成人精品视频| 国内免费精品视频| 在线观看免费视频综合| 中日精品一色哟哟| 3d成人动漫网站| 人人妻人人澡人人爽人人欧美一区 | 制服丝袜在线播放| 91精品国产99| 婷婷综合六月| 国产精品丝袜高跟| 国产成人在线中文字幕| 久久另类ts人妖一区二区| 精品国产一区二区三区四区| 四虎4hu永久免费入口| 激情偷拍久久| 亚洲成色www.777999| 精品一区免费av| 国产精品成人免费一区久久羞羞| 不卡一区二区在线| 萌白酱视频在线| 亚洲福中文字幕伊人影院| 亚洲GV成人无码久久精品 | 久久99精品久久久久久噜噜 | av免费在线观看不卡| 日韩精品福利在线| www.中文字幕久久久| 国产一区二区动漫| av小说在线播放| 国产欧美日韩亚洲精品| 婷婷亚洲精品| 国产精品jizz在线观看老狼| 好吊一区二区三区| 欧美一级视频在线| av一本久道久久综合久久鬼色| 久久久精品成人| 五月天国产精品| 国产精品热久久| 日韩电影在线观看永久视频免费网站| 免费人成在线观看播放视频| 国内精品久久久久久中文字幕 | 四虎影视在线播放| 久久精品这里热有精品| yellow在线观看网址| 亚洲一区制服诱惑| 久久av超碰| 自拍日韩亚洲一区在线| 精品系列免费在线观看| aaaaa一级片| 五月激情丁香一区二区三区| 一区二区三区精彩视频| 国产视频久久久| 国产美女高潮在线| 亚洲一区二区在线| 成人a'v在线播放| 日本在线观看a| 成人免费毛片嘿嘿连载视频| 久久久精品视频免费观看| 欧美午夜精品电影| 日本免费不卡| 8090成年在线看片午夜| 精品国产乱码一区二区三区| 欧美一区1区三区3区公司| 国产精品日本欧美一区二区三区| 特级黄色片视频| 中文字幕综合网| 一区二区国产欧美| 伊人久久久久久久久久久| 二区三区不卡| 久久精品美女| 黄色精品网站| 国产精品福利导航| 亚洲在线观看免费| 人妻一区二区三区免费| 欧美日韩成人黄色| 欧美国产中文高清| 国产一级大片免费看| 国产一区欧美一区| www.4hu95.com四虎| 欧美视频一区二区在线观看| 免费在线观看一级毛片| 国产suv精品一区二区三区88区| 欧美日韩破处| 一二三四视频社区在线| 国产精品一区二区在线播放| 日本黄色激情视频| 4hu四虎永久在线影院成人| 麻豆影院在线观看| 97夜夜澡人人双人人人喊| 韩日欧美一区| 四虎永久免费观看| 精品日本高清在线播放| 午夜激情小视频| 青青久久av北条麻妃黑人| 伊人久久大香线蕉综合网站| 俄罗斯av网站| 99riav一区二区三区| 日本视频在线观看免费| 国产亚洲精品综合一区91| 欧美午夜三级| 日韩精品福利片午夜免费观看| 99免费精品在线观看| 中文字字幕在线中文| 亚洲人成电影网站色www| 天堂综合在线播放| 国产在线无码精品| 久久久一区二区三区捆绑**| 天天综合久久综合| www.欧美免费| 国产精品一区二区三区美女| www在线观看免费| 国产精品福利一区二区| 国产99视频在线| 色综合久综合久久综合久鬼88| 台湾佬综合网| 日韩高清第一页| 午夜视频一区在线观看| 九色视频在线播放| 国产精品偷伦一区二区| 最新欧美人z0oozo0| 91黄色免费视频| 欧美日韩一区不卡| 牛牛精品视频在线| 日本在线观看一区二区三区| 国产精品亚洲综合一区在线观看| 免费看日韩毛片| 中文字幕日韩在线视频| 久久男人av| 五月激情婷婷在线| 色综合天天综合在线视频|