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

自己動手寫一個iOS 網絡請求庫的三部曲

移動開發 iOS
NSURLSession 是 iOS7 引入的新網絡請求接口,在 WWDC2013 中有詳細介紹,下面是描述其結構的一頁 slides:

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

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

本系列文章中,我們將嘗試使用 NSURLSession 技術構建一個自己的網絡請求庫。

NSURLSession 簡介

NSURLSession 是 iOS7 引入的新網絡請求接口,在 WWDC2013 中有詳細介紹,下面是描述其結構的一頁 slides:

當應用在前臺時,NSURLSession 跟 NSURLConnection 沒有什么區別,但是在程序切換到后臺之后 Background Session 就會更加靈活。

嘗試 NSURLSession

準備工作

新建一個名為 BuildYourHTTPRequestLibrary 的單頁面應用,在頁面上居中放置一個按鈕,名為 Request:

拖動綁定 Touch Up Inside 事件:

使用 NSURLSession

在 mainButtonBeTapped 函數內填充以下代碼:

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. let session = NSURLSession.sharedSession() 
  3. let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) 
  4. let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  5. let string = NSString(data: data, encoding: NSUTF8StringEncoding) 
  6. println(string) 
  7. }) 
  8. task.resume() 
  9. }

     

 

使用成功!

感受異步

異步

改寫 mainButtonBeTapped 函數的代碼:

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

再次嘗試,兩次打印之間間隔了五秒,主線程未阻塞,證明 NSURLSession 為異步執行。

阻塞

嘗試多次點擊,我們能夠看到每五秒執行一次,直到全部執行完畢。

NSURLSession 采用的是 “異步阻塞” 模型,即所有請求在發出后都進入 2# 線程執行,在 2# 線程內部按照阻塞隊列模式執行。

#p#

 

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

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

 

[[135519]]

基本封裝

基礎準備

新建一個 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 方法的結果一致。

至此,接口封裝完成!

 

#p#

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

本文中,我們將一起降低之前代碼的耦合度,并使用適配器模式實現一層獨立于底層結構的網絡 API,造一個真正的網絡請求“庫”。

降低耦合度

如何降低耦合度

現在的清湯掛面式的代碼雖然便于理解,但是功能單一,代碼雜亂。我們一起來分析 NSURLSession 的使用過程:

構造 NSURLRequest

確定 URL

確定 HTTP 方法(GET、POST 等)

添加特定的 HTTP 頭

填充 HTTP Body

驅動 session.dataTaskWithRequest 方法,開始請求

具體實施

在 Network 下另外新建一個 NetworkManager 類,將 URL、params、files 等設為成員變量,讓他們在構造函數中初始化:

  1. class NetworkManager { 
  2.  
  3. let method: String! 
  4. let params: Dictionary let callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void 
  5.  
  6. let session = NSURLSession.sharedSession() 
  7. let url: String! 
  8. var request: NSMutableURLRequest! 
  9. var task: NSURLSessionTask! 
  10.  
  11. init(url: String, method: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  12. self.url = url 
  13. self.request = NSMutableURLRequest(URL: NSURL(string: url)!) 
  14. self.method = method 
  15. self.params = params 
  16. self.callback = callback 

之后,將上面分析的

1. 確定 URL

2. 確定 HTTP 方法(GET、POST 等)

3. 添加特定的 HTTP 頭

4. 填充 HTTP Body

前三步封裝到一個 function 中,***一步封裝到一個 function 中,然后把驅動 session.dataTaskWithRequest 的代碼封裝到一個 function 中:

 

  1. func buildRequest() { 
  2. if self.method == "GET" && self.params.count > 0 { 
  3. self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + buildParams(self.params))!) 
  4.  
  5. request.HTTPMethod = self.method 
  6.  
  7. if self.params.count > 0 { 
  8. request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type"
  9. func buildBody() { 
  10. if self.params.count > 0 && self.method != "GET" { 
  11. request.HTTPBody = buildParams(self.params).nsdata 
  12. func fireTask() { 
  13. task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  14. self.callback(data: data, response: response, error: error) 
  15. }) 
  16. task.resume() 

之后使用一個統一的方法來驅動上面三個 function,完成請求:

  1. func fire() { 
  2. buildRequest() 
  3. buildBody() 
  4. fireTask() 

同時,不要忘了那三個 parse params 的從 Alamofire 偷來的函數哦,也要放到這個類里面。至此,降低耦合的工作基本完成,接下來我們開始封裝“網絡API”。

使用適配器模式封裝“網絡API”

理解適配器模式

適配器模式是設計模式中的一種,很容易理解:我的 APP 需要一個獲取某一個 URL 返回的字符串的功能,我現在選擇的是 Alamofire,但是正在發展的 Pitaya 看起來不錯,我以后想替換成 Pitaya,所以我封裝了一層我自己的網絡接口,用來屏蔽底層細節,到時候只需要修改這個類,不需要再深入項目中改那么多接口調用了。

適配器模式聽起來高大上,其實這是我們在日常編碼中非常常用的設計模式。

Do it!

修改 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 manager = NetworkManager(url: url, method: method, params: params, callback: callback) 
  4. manager.fire() 

搞定!

封裝多級接口

不帶 params 的接口:

  1. static func request(method: String, url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: method, callback: callback) 
  3. manager.fire() 

兩個 get 接口(帶與不帶 params):

 

  1. static func get(url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: "GET", callback: callback) 
  3. manager.fire() 
  4. static func get(url: String, params: Dictionary, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  5. let manager = NetworkManager(url: url, method: "GET", params: params, callback: callback) 
  6. manager.fire() 

兩個 post 接口(帶與不帶 params):

 

  1. static func post(url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: "POST", callback: callback) 
  3. manager.fire() 
  4. static func post(url: String, params: Dictionary, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  5. let manager = NetworkManager(url: url, method: "POST", params: params, callback: callback) 
  6. manager.fire() 

測試接口

修改 ViewController 中的調用代碼,測試多級 API:

 

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. let url = "http://pitayaswift.sinaapp.com/pitaya.php" 
  3.  
  4. Network.post(url, callback: { (data, response, error) -> Void in 
  5. println("POST 1 請求成功"
  6. }) 
  7. Network.post(url, params: ["post""POST Network"], callback: { (data, response, error) -> Void in 
  8. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  9. println("POST 2 請求成功 " + string) 
  10. }) 
  11.  
  12. Network.get(url, callback: { (data, response, error) -> Void in 
  13. println("GET 1 請求成功"
  14. }) 
  15. Network.get(url, params: ["get""POST Network"], callback: { (data, response, error) -> Void in 
  16. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  17. println("GET 2 請求成功 " + string) 
  18. }) 
  19.  
  20. Network.request("GET", url: url, params: ["get""Request Network"]) { (data, response, error) -> Void in 
  21. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  22. println("Request 請求成功 " + string) 

運行項目,點擊按鈕,查看效果:

 

多級 API 封裝成功!

 

【責任編輯:chenqingxiang TEL:(010)68476606】

責任編輯:chenqingxiang 來源: CocoaChina
相關推薦

2015-06-02 09:51:40

iOS網絡請求封裝接口

2015-06-02 10:24:43

iOS網絡請求降低耦合

2022-10-10 09:10:51

家庭網絡網絡

2011-03-25 09:56:40

Nagios 安裝

2009-09-14 09:04:17

CCNA考試CCNA

2011-08-03 10:33:05

網絡管理網絡拓撲管理

2010-05-12 10:51:06

2010-07-17 01:12:31

Telnet服務

2010-09-26 14:39:40

DHCP故障分析

2011-03-09 09:30:52

Mina

2011-03-21 09:22:46

Tomcat

2010-09-06 09:22:26

CSS語法

2013-06-28 09:35:04

Hypervisor虛擬化成本

2015-05-12 10:42:53

程序員代碼

2012-09-10 16:19:00

云計算公共云

2017-04-11 09:07:20

互聯網

2017-02-07 14:50:39

華為

2018-03-18 15:51:59

人工智能潛力首席數據官

2018-03-19 09:35:37

人工智能

2009-04-07 11:07:16

網絡營銷
點贊
收藏

51CTO技術棧公眾號

欧美v亚洲v| 丰满少妇xbxb毛片日本| 成a人片在线观看www视频| 久久精品国产99久久6| 北条麻妃久久精品| 亚洲一区二区三区黄色| 午夜影院一区| 国产精品嫩草影院av蜜臀| 91欧美激情另类亚洲| 国产一级黄色av| 亚洲黄页网站| 7777精品久久久大香线蕉| 亚洲理论电影在线观看| 黄色在线观看网| 精品一区二区三区蜜桃| 91精品国产高清自在线看超| 日韩一级片在线免费观看| 国产精品一区二区美女视频免费看 | 奇米777欧美一区二区| 久久精品一区中文字幕| 中文在线一区二区三区| 日韩av黄色| 精品久久久久国产| 吴梦梦av在线| 欧美午夜黄色| 顶级嫩模精品视频在线看| 国产精品激情av电影在线观看| 久久久99精品| 欧美日一区二区| 亚洲第一中文字幕| www.成年人| 成人爽a毛片免费啪啪| 一区二区三区久久久| 亚洲高清视频一区二区| 日本高清视频网站| 激情都市一区二区| 国产精品第三页| 日韩三级av在线| 中文字幕日本视频| 国产视频福利在线| 国产成人av在线影院| 国产精品免费看久久久香蕉| 中国一级免费毛片| 欧美二区不卡| 久久在线视频在线| 黄色免费一级视频| 国产欧美一区二区三区精品观看 | 这里只有精品视频在线| 人体私拍套图hdxxxx| 亚洲日本一区二区三区在线| 欧美老女人在线| 日韩一级免费在线观看| 日韩脚交footjobhdboots| 亚洲一区二区av在线| 久久精品在线免费视频| 国产在线一区二区视频| 国产精品久久毛片av大全日韩| 欧美高清视频一区| 人成在线免费视频| 91小视频免费观看| 久久精品成人一区二区三区蜜臀| 十八禁一区二区三区| 国产91综合一区在线观看| www.久久久| 亚洲欧美高清视频| 国产98色在线|日韩| 成人欧美一区二区| 欧洲成人一区二区三区| 成人国产精品免费网站| 国产高清精品一区二区三区| 丰满肥臀噗嗤啊x99av| 成人小视频免费在线观看| 俄罗斯精品一区二区三区| 蜜桃av噜噜一区二区三区麻豆| 高清在线不卡av| 精品免费国产| 日本韩国一区| 国产午夜精品一区二区三区四区| 欧美日韩最好看的视频| 北岛玲一区二区三区| 国产精品女同互慰在线看| 91色porny在线视频| 欧美极度另类性三渗透| 免费在线观看黄视频| 亚洲视屏一区| 日韩免费av片在线观看| 在线播放一级片| 国产高清一区日本| 久久99精品久久久久久久青青日本 | 午夜视频在线观看一区二区三区| 免费看的黄色大片| 日韩高清不卡| 日韩三级.com| 亚洲制服丝袜在线播放| 成人一二三区| 九色91av视频| 中文字幕av影院| 九色porny丨国产精品| 91精品久久久久久久久久| 粉嫩av一区二区夜夜嗨| 国产视频一区二区在线| 六月婷婷激情网| 在线最新版中文在线| 欧美日韩www| 一级黄色片毛片| 精品一区二区三| 九色精品美女在线| 中文字幕 国产精品| 国产精品亚洲午夜一区二区三区| 久久青青草原一区二区| 麻豆传媒免费在线观看| 亚洲成人自拍一区| 一级片视频免费观看| 成人h动漫精品一区二区器材| 亚洲欧美成人一区二区在线电影| 免费成人深夜夜行网站| 久久精品麻豆| 国产91精品一区二区绿帽| 99re在线视频| 精品久久久在线观看| 伊人精品视频在线观看| 自拍偷拍欧美一区| 欧美精品久久一区二区| 136福利视频导航| 91香蕉视频污在线| 日韩欧美猛交xxxxx无码| 精品国产黄a∨片高清在线| 欧美理论电影| 自拍偷在线精品自拍偷无码专区| 久久精品.com| 9l亚洲国产成人精品一区二三 | 手机在线看片日韩| 93在线视频精品免费观看| 欧美亚洲一区在线| 亚洲精品久久久久avwww潮水 | 国产精品一区视频网站| 黄网站在线播放| 在线日韩国产精品| 北岛玲一区二区| 在线观看不卡| 99久久伊人精品影院| 欧美人xxx| 在线中文字幕一区二区| 超碰97人人干| 一区二区国产在线观看| av成人综合网| 亚洲七七久久综合桃花剧情介绍| 欧美精三区欧美精三区 | 亚洲欧美激情在线| 午夜激情av在线| 欧美日韩一区二区三区视频播放| 热99在线视频| 蜜桃视频在线播放| 日韩欧美国产中文字幕| 无码人妻精品一区二区三应用大全 | 美女网站视频色| 日本在线播放一区二区三区| 欧美一级爱爱| julia一区二区三区中文字幕| 亚洲高清av在线| 国产无套内射又大又猛又粗又爽| 国产精品白丝jk黑袜喷水| 福利网在线观看| 国产美女精品视频免费播放软件| 精品国产一区二区三区久久久| 在线视频1卡二卡三卡| 国产精品水嫩水嫩| 久久久久xxxx| 欧美~级网站不卡| a级国产乱理论片在线观看99| 国产偷倩在线播放| 亚洲激情视频在线播放| 视频一区二区三区四区五区| 久久色中文字幕| av五月天在线| 99精品在线观看| 成人在线视频网站| 免费网站看v片在线a| 欧美成人精品二区三区99精品| 国产精品99精品| 久久久五月婷婷| 亚洲娇小娇小娇小| 午夜欧美精品久久久久久久| 婷婷国产精品| 精品国产一区二区三区四区在线观看 | 北条麻妃国产九九九精品小说 | 日韩国产欧美区| 波多野结衣在线观看一区| 中文字幕日韩精品一区| 午夜福利三级理论电影| 先锋a资源在线看亚洲| 日韩精品久久一区| 青草综合视频| 欧美精品18videos性欧| 六十路在线观看| 制服丝袜亚洲色图| 亚洲日本韩国在线| 国产精品日产欧美久久久久| 91人妻一区二区三区| 一本色道久久综合亚洲精品高清| 日本视频精品一区| 亚洲第一二区| 日韩美女视频在线观看| 超碰电影在线播放| 亚洲女人天堂成人av在线| 97在线公开视频| 福利精品视频在线| 性生交大片免费全黄| 久久综合九色欧美综合狠狠| 午夜免费福利网站| 久久视频一区| 免费看日本黄色| 成人av国产| 国外成人在线视频网站| 视频欧美精品| 欧美专区日韩视频| 四虎影院观看视频在线观看| 亚洲午夜女主播在线直播| 丰满大乳国产精品| 欧美精品自拍偷拍| 免费无码国产精品| 亚洲成a人在线观看| 国产成人精品视频免费| 久久五月婷婷丁香社区| 91精品国产高清91久久久久久| 日韩av在线发布| 少妇人妻大乳在线视频| 婷婷激情图片久久| 三区精品视频观看| 色综合久久中文| 高清视频在线观看一区| 中文成人在线| 国产精品露脸自拍| 激情开心成人网| 欧美有码在线观看| 大黄网站在线观看| 欧美日韩福利电影| 免费在线午夜视频| 中文综合在线观看| www 日韩| 一本大道久久加勒比香蕉| 色在线免费视频| 日韩av在线免费观看一区| 国产综合无码一区二区色蜜蜜| 欧美一区二区视频在线观看2022| 中文字幕乱码在线观看| 91国产免费看| 成年人视频在线免费看| 亚洲国产成人va在线观看天堂| av激情在线观看| 亚洲视频在线一区观看| 国产小视频你懂的| 中文字幕一区二区三区精华液 | 天天躁日日躁狠狠躁欧美| 国产高清一区视频| 大型av综合网站| 国产一区二区在线网站 | 日本三级中国三级99人妇网站| 日日天天久久| 麻豆91av| 神马电影久久| 日韩性感在线| 久久国产成人午夜av影院宅| 亚洲精品国产系列| 午夜精品一区二区三区国产| 中文字幕中文字幕一区三区| 久久久久久久久久久久久久久久久久 | 亚洲自偷自拍熟女另类| 香蕉av777xxx色综合一区| 六月丁香婷婷激情| 水野朝阳av一区二区三区| 精品久久久久久久无码| 久久99蜜桃精品| 日本泡妞xxxx免费视频软件| 国产999精品久久久久久| 精品视频站长推荐| 久久免费看少妇高潮| 黄色国产在线播放| 亚洲精品成人精品456| 日韩三级av在线| 色婷婷av一区二区三区gif| 一区二区视频网站| 欧美一区二区视频观看视频 | 日韩精品久久久久 | 久久人人爽人人爽| 毛片视频免费播放| 一区二区三区资源| 中文字幕第四页| 欧美三级韩国三级日本一级| 国产三级视频在线播放| 亚洲精品电影在线| 尤物网在线观看| 欧美激情亚洲综合一区| 久久91导航| 91成人理论电影| 免费毛片在线不卡| 麻豆一区二区三区在线观看| 亚洲一区视频| 亚洲色图偷拍视频| av福利精品导航| 2017亚洲天堂| 精品久久香蕉国产线看观看gif| 在线观看xxxx| 亚洲国产成人在线播放| 淫片在线观看| 91tv亚洲精品香蕉国产一区7ujn| 日韩毛片免费视频一级特黄| 国新精品乱码一区二区三区18| 欧美日中文字幕| 国产肉体ⅹxxx137大胆| 青草av.久久免费一区| 日本国产在线视频| 国产精品国模大尺度视频| 日韩污视频在线观看| 综合久久2019| 最新91在线视频| 国产欧洲在线| 91精品啪aⅴ在线观看国产| 亚瑟一区二区三区四区| 麻豆视频传媒入口| 免费av成人在线| 亚洲の无码国产の无码步美| 亚洲视频一区在线观看| www.日韩一区| 亚洲精品大尺度| 日本片在线看| 成人国产亚洲精品a区天堂华泰| 免费电影一区二区三区| 免费在线看黄色片| 国产做a爰片久久毛片| 免费黄在线观看| 动漫精品一区二区| 男人天堂手机在线观看| 久久中文字幕国产| 成人午夜毛片| 欧美一区二区三区在线播放 | 久久久精品国产sm调教| 欧美日韩国产经典色站一区二区三区| 天堂中文在线资| 韩国三级日本三级少妇99| 在线精品国产亚洲| 丰满人妻一区二区三区53号| 久久av中文字幕片| 蜜桃av免费观看| 欧美视频第二页| 都市激情一区| 国产精品成人品| 欧洲杯足球赛直播| 日韩av手机版| 国产精品区一区二区三| 中文区中文字幕免费看| 国产一区二区av| 国产国产一区| 亚洲午夜激情| 国内精品国产三级国产a久久| 老司机福利在线观看| 欧美熟乱第一页| 国产黄色在线| 国产欧美久久一区二区| 91视频精品| 激情成人在线观看| 亚洲乱码一区二区三区在线观看| 国产视频在线观看免费| 久久九九国产精品怡红院| 精品国产不卡一区二区| 色婷婷777777仙踪林| 丁香另类激情小说| 91香蕉在线视频| 亚洲石原莉奈一区二区在线观看| 三上悠亚亚洲一区| 亚洲成色www久久网站| 久久成人免费日本黄色| 精品国产精品国产精品| 精品国产乱码久久久久久老虎| sm性调教片在线观看| 欧美久久在线| 精品一区二区综合| 免费看一级一片| 日韩av一区在线观看| 日韩一区二区三区免费| 中文字幕一区综合| 丁香五精品蜜臀久久久久99网站 | 国产精品高清在线| 色婷婷热久久| 午夜性福利视频| 欧美性生交大片免网| 最新电影电视剧在线观看免费观看| 91亚洲国产成人精品性色| 伊人成人在线视频| 日韩中文字幕有码| 91精品国产综合久久久蜜臀粉嫩 | 18久久久久久| 青青草91久久久久久久久| 中文字幕 欧美 日韩| 欧美性xxxxxxxxx| 久草资源在线| 久久精品日产第一区二区三区乱码 | 国产伦精品一区二区三区视频青涩 | 中文字幕一区二区三区5566| 成人av片在线观看|