自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自己動手寫一個 iOS 網(wǎng)絡(luò)請求庫——封裝接口

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

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

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

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

 

[[135523]]

基本封裝

基礎(chǔ)準(zhǔn)備

新建一個 Swift 空文件,命名為 Network.swift,在里面寫一個 Network 類,之后寫一個靜態(tài)方法 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 中的按鈕函數(shù):

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

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

自定義 HTTP method 和 URL

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

  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() 

修改前面的函數(shù)調(diào)用:

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

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

使用閉包處理請求結(jié)果

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

  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() 

在前面函數(shù)調(diào)用處使用閉包進(jìn)行結(jié)果處理:
 

  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) 

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

動態(tài)增加 Params

GET 方法

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

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

為了處理 params,我們從 Alamofire 偷來他的 params 處理函數(shù)。如果是 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 偷了三個函數(shù) 
  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 

修改前面的函數(shù)調(diào)用:

  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 是我部署的用于測試的服務(wù)端代碼,會直接返回 ?get=ooxx 中的 ooxx。運行項目,點擊按鈕,查看效果:

POST 方法

POST 方法下有幾個協(xié)議可供選擇,此處沒有文件上傳,我們采用較簡單的 application/x-www-form-urlencoded 方式發(fā)送請求。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() 

修改前面的函數(shù)調(diào)用:

  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 方式發(fā)送請求,同樣服務(wù)端會返回 key 為 post 的 value 的值。運行項目,點擊按鈕,結(jié)果和前面 GET 方法的結(jié)果一致。

至此,接口封裝完成!

責(zé)任編輯:chenqingxiang 來源: 呂文翰_JohnLui 的博客
相關(guān)推薦

2015-06-02 10:24:43

iOS網(wǎng)絡(luò)請求降低耦合

2015-06-02 09:41:00

iOS網(wǎng)絡(luò)請求NSURLSessio

2017-03-02 13:31:02

監(jiān)控系統(tǒng)

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解析器

2014-11-26 10:54:20

C#

2023-12-15 10:14:42

數(shù)據(jù)庫select語句

2015-07-23 14:53:50

貝葉斯分類器

2021-02-22 17:17:38

Proxy緩存代碼

2021-07-04 10:07:04

Virtual DO閱讀源碼虛擬DOM

2018-04-08 11:20:43

深度學(xué)習(xí)

2018-02-07 10:46:20

數(shù)據(jù)存儲

2018-09-12 10:58:11

NBA數(shù)據(jù)存儲

2024-03-08 12:45:00

C#Web服務(wù)器

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技術(shù)棧公眾號