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

Forest輕量級HTTP客戶端API框架,該丟棄HttpClient了

開源
輕量級HTTP客戶端API框架,讓Java發送HTTP/HTTPS請求不再難。它比OkHttp和HttpClient更高層,是封裝調用第三方restful api client接口的好幫手,是retrofit和feign之外另一個選擇。

[[394925]]

一、前言

最近在碼云上扒了一波,發現了一個非常優秀的開源的輕量級HTTP客戶端API框架Forest,這款API框架讓Java發送HTTP/HTTPS請求不再難,他比原先了OkHttp和HttpClient更高層,以前在調用一個第三方外部API接口時,你可能需要使用HTTPClient或者OkHttp工具來實現,封裝一個HTTPClientUtil工具類,工具類中封裝一些Post/Get請求,那么現在你完全不需要這么做了,使用Forest框架只需要在你的接口上面加一個注解即可實現第三方API接口的調用。

二、Forest簡介

1.簡介

輕量級HTTP客戶端API框架,讓Java發送HTTP/HTTPS請求不再難。它比OkHttp和HttpClient更高層,是封裝調用第三方restful api client接口的好幫手,是retrofit和feign之外另一個選擇。

  • 項目主頁: http://forest.dtflyx.com/
  • 中文文檔: http://forest.dtflyx.com/docs/

2.什么是 Forest?

orest 是一個開源的 Java HTTP 客戶端框架,它能夠將 HTTP 的所有請求信息(包括 URL、Header 以及 Body 等信息)綁定到您自定義的 Interface 方法上,能夠通過調用本地接口方法的方式發送 HTTP 請求。

3. 為什么使用 Forest?

使用 Forest 就像使用類似 Dubbo 那樣的 RPC 框架一樣,只需要定義接口,調用接口即可,不必關心具體發送 HTTP 請求的細節。同時將 HTTP 請求信息與業務代碼解耦,方便您統一管理大量 HTTP 的 URL、Header 等信息。而請求的調用方完全不必在意 HTTP 的具體內容,即使該 HTTP 請求信息發生變更,大多數情況也不需要修改調用發送請求的代碼。

4.Forest 的工作原理

Forest 會將您定義好的接口通過動態代理的方式生成一個具體的實現類,然后組織、驗證 HTTP 請求信息,綁定動態數據,轉換數據形式,SSL 驗證簽名,調用后端 HTTP API(httpclient 等 API)執行實際請求,等待響應,失敗重試,轉換響應數據到 Java 類型等臟活累活都由這動態代理的實現類給包了。請求發送方調用這個接口時,實際上就是在調用這個干臟活累活的實現類。

5.Forest 的架構

 

architecture

我們講 HTTP 發送請求的過程分為前端部分和后端部分,Forest 本身是處理前端過程的框架,是對后端 HTTP API 框架的進一步封裝。

前端部分:

  1. Forest 配置:負責管理 HTTP 發送請求所需的配置。
  2. Forest 注解:用于定義 HTTP 發送請求的所有相關信息,一般定義在 interface 上和其方法上。
  3. 動態代理:用戶定義好的 HTTP 請求的interface將通過動態代理產生實際執行發送請求過程的代理類。
  4. 模板表達式:模板表達式可以嵌入在幾乎所有的 HTTP 請求參數定義中,它能夠將用戶通過參數或全局變量傳入的數據動態 綁定到 HTTP 請求信息中。
  5. 數據轉換:此模塊將字符串數據和JSON或XML形式數據進行互轉。目前 JSON 轉換器支持Jackson、Fastjson、Gson三種,XML 支持JAXB一種。
  6. 攔截器:用戶可以自定義攔截器,攔截指定的一個或一批請求的開始、成功返回數據、失敗、完成等生命周期中的各個環節,以插入自定義的邏輯進行處理。
  7. 過濾器:用于動態過濾和處理傳入 HTTP 請求的相關數據。
  8. SSL:Forest 支持單向和雙向驗證的 HTTPS 請求,此模塊用于處理 SSL 相關協議的內容。

后端部分:

后端為實際執行 HTTP 請求發送過程的第三方 HTTP API,目前支持okHttp3和httpclient兩種后端 API。

Spring Boot Starter Forest:提供對Spring Boot的支持

環境要求

Forest 1.0.x 和 Forest 1.1.x 基于 JDK 1.7, Forest 1.2.x及以上版本基于 JDK 1.8

三、Forest有哪些特性?

  • 以Httpclient和OkHttp為后端框架
  • 通過調用本地方法的方式去發送Http請求, 實現了業務邏輯與Http協議之間的解耦
  • 因為針對第三方接口,所以不需要依賴Spring Cloud和任何注冊中心
  • 支持所有請求方法:GET, HEAD, OPTIONS, TRACE, POST, DELETE, PUT, PATCH
  • 支持文件上傳和下載
  • 支持靈活的模板表達式
  • 支持攔截器處理請求的各個生命周期
  • 支持自定義注解
  • 支持OAuth2驗證
  • 支持過濾器來過濾傳入的數據
  • 基于注解、配置化的方式定義Http請求
  • 支持Spring和Springboot集成
  • JSON字符串到Java對象的自動化解析
  • XML文本到Java對象的自動化解析
  • JSON、XML或其他類型轉換器可以隨意擴展和替換
  • 支持JSON轉換框架: Fastjson, Jackson, Gson
  • 支持JAXB形式的XML轉換
  • 可以通過OnSuccess和OnError接口參數實現請求結果的回調
  • 配置簡單,一般只需要@Request一個注解就能完成絕大多數請求的定義
  • 支持異步請求調用

四、SpringBoot如何快速接入

在官方的文檔上明確介紹了有關Spring傳統項目如何接入Forest,這里我直接以SpringBoot為例,都是一個道理,無非對于SpringBoot提供的是xxx-spring-boot-starter以開頭的依賴forest-spring-boot-starter。

1. 第一步:添加Maven依賴

直接添加以下maven依賴即可:

  1. <dependency> 
  2.     <groupId>com.dtflys.forest</groupId> 
  3.     <artifactId>forest-spring-boot-starter</artifactId> 
  4.     <version>1.5.0</version> 
  5. </dependency> 

2. 第二步:創建一個interfacepackage

  1. package com.yoursite.client; 
  2.  
  3. import com.dtflys.forest.annotation.Request; 
  4. import com.dtflys.forest.annotation.DataParam; 
  5.  
  6. public interface AmapClient { 
  7.  
  8.     /** 
  9.      * 聰明的你一定看出來了@Get注解代表該方法專做GET請求 
  10.      * 在url中的${0}代表引用第一個參數,${1}引用第二個參數 
  11.      */ 
  12.     @Get("http://ditu.amap.com/service/regeo?longitude=${0}&latitude=${1}"
  13.     public Map getLocation(String longitude, String latitude); 
  14.      

3. 第三步:掃描接口

在Spring Boot的配置類或者啟動類上加上@ForestScan注解,并在basePackages屬性里填上遠程接口的所在的包名:

  1. @SpringBootApplication 
  2. @Configuration 
  3. @ForestScan(basePackages = "com.yoursite.client"
  4. public class MyApplication { 
  5.   public static void main(String[] args) { 
  6.       SpringApplication.run(MyApplication.class, args); 
  7.    } 

4. 第四步:調用接口

  1. // 注入接口實例 
  2. @Autowired 
  3. private AmapClient amapClient; 
  4. ... 
  5. // 調用接口 
  6. Map result = amapClient.getLocation("121.475078""31.223577"); 
  7. System.out.println(result); 

5. application.yml全局基本配置

  1. forest: 
  2.   bean-id: config0 # 在spring上下文中bean的id, 默認值為forestConfiguration 
  3.   backend: okhttp3 # 后端HTTP API:okhttp3 
  4.   max-connections: 1000 # 連接池最大連接數,默認值為500 
  5.   max-route-connections: 500 # 每個路由的最大連接數,默認值為500 
  6.   timeout: 3000 # 請求超時時間,單位為毫秒, 默認值為3000 
  7.   connect-timeout: 3000 # 連接超時時間,單位為毫秒, 默認值為2000 
  8.   retry-count: 1 # 請求失敗后重試次數,默認為0次不重試 
  9.   ssl-protocol: SSLv3 # 單向驗證的HTTPS的默認SSL協議,默認為SSLv3 
  10.   logEnabled: true # 打開或關閉日志,默認為true 
  11.   log-request: true # 打開/關閉Forest請求日志(默認為 true) 
  12.   log-response-status: true # 打開/關閉Forest響應狀態日志(默認為 true) 
  13.   log-response-content: true # 打開/關閉Forest響應內容日志(默認為 false 

五、支持發送的請求類型

1. 請求類型:可支持(GET, POST, PUT, HEAD, OPTIONS, DELETE)使用POST方式

  1. public interface MyClient { 
  2.  
  3.     /** 
  4.      * 通過 @Request 注解的 type 參數指定 HTTP 請求的方式。 
  5.      */ 
  6.     @Request( 
  7.             url = "http://localhost:8080/hello"
  8.             type = "POST" 
  9.     ) 
  10.     String simplePost(); 
  11.  
  12.     /** 
  13.      * 使用 @Post 注解,可以去掉 type = "POST" 這行屬性 
  14.      */ 
  15.     @Post("http://localhost:8080/hello"
  16.     String simplePost(); 
  17.  
  18.     /** 
  19.      * 使用 @PostRequest 注解,和上面效果等價 
  20.      */ 
  21.     @PostRequest("http://localhost:8080/hello"
  22.     String simplePost(); 
  23.  

除了GET和POST,也可以指定成其他幾種HTTP 請求方式(PUT, HEAD, OPTIONS, DELETE)。

其中type屬性的大小寫不敏感,寫成POST和post效果相同。

  • GET和POST大小寫不敏感
  1. // GET請求 
  2. @Request( 
  3.         url = "http://localhost:8080/hello"
  4.         type = "get" 
  5. String simpleGet(); 
  6.  
  7. // POST請求 
  8. @Request( 
  9.         url = "http://localhost:8080/hello"
  10.         type = "post" 
  11. String simplePost(); 
  12.  
  13. // PUT請求 
  14. @Request( 
  15.         url = "http://localhost:8080/hello"
  16.         type = "put" 
  17. String simplePut(); 
  18.  
  19. // HEAD請求 
  20. @Request( 
  21.         url = "http://localhost:8080/hello"
  22.         type = "head" 
  23. String simpleHead(); 
  24.  
  25. // Options請求 
  26. @Request( 
  27.         url = "http://localhost:8080/hello"
  28.         type = "options" 
  29. String simpleOptions(); 
  30.  
  31. // Delete請求 
  32. @Request( 
  33.         url = "http://localhost:8080/hello"
  34.         type = "delete" 
  35. String simpleDelete(); 

另外,可以用@GetRequest, @PostRequest等注解代替@Request注解,這樣就可以省去寫type屬性的麻煩了。

  • 例如xxxRequest等價于xxx
  1. // GET請求 
  2. @Get("http://localhost:8080/hello"
  3. String simpleGet(); 
  4.  
  5. // GET請求 
  6. @GetRequest("http://localhost:8080/hello"
  7. String simpleGetRequest(); 
  8.    
  9. // POST請求 
  10. @Post("http://localhost:8080/hello"
  11. String simplePost(); 
  12.  
  13. // POST請求 
  14. @PostRequest("http://localhost:8080/hello"
  15. String simplePostRequest(); 
  16.  
  17. // PUT請求 
  18. @Put("http://localhost:8080/hello"
  19. String simplePut(); 
  20.  
  21. // PUT請求 
  22. @PutRequest("http://localhost:8080/hello"
  23. String simplePutRequest(); 
  24.  
  25. // HEAD請求 
  26. @HeadRequest("http://localhost:8080/hello"
  27. String simpleHead(); 
  28.  
  29.  
  30. // Options請求 
  31. @Options("http://localhost:8080/hello"
  32. String simpleOptions(); 
  33.  
  34. // Options請求 
  35. @OptionsRequest("http://localhost:8080/hello"
  36. String simpleOptionsRequest(); 
  37.  
  38. // Delete請求 
  39. @Delete("http://localhost:8080/hello"
  40. String simpleDelete(); 
  41.  
  42. // Delete請求 
  43. @DeleteRequest("http://localhost:8080/hello"
  44. String simpleDeleteRequest(); 

如上所示,請求類型是不是更一目了然了,代碼也更短了。

@Get和@GetRequest兩個注解的效果是等價的,@Post和@PostRequest、@Put和@PutRequest等注解也是同理。

六、支持的數據發送格式

1. 發送JSON數據

  • 將對象參數解析為JSON字符串,并放在請求的Body進行傳輸 :
  1. /** 
  2.  * 將對象參數解析為JSON字符串,并放在請求的Body進行傳輸 
  3.  */ 
  4. @Post("/register"
  5. public String registerUser(@JSONBody MyUser user); 
  • 將Map類型參數解析為JSON字符串,并放在請求的Body進行傳輸 :
  1. /** 
  2.  * 將Map類型參數解析為JSON字符串,并放在請求的Body進行傳輸 
  3.  */ 
  4. @Post("/test/json"
  5. public String postJsonMap(@JSONBody Map mapObj); 
  • 直接傳入一個JSON字符串,并放在請求的Body進行傳輸 :
  1. /** 
  2.  * 直接傳入一個JSON字符串,并放在請求的Body進行傳輸 
  3.  */ 
  4. @Post("/test/json"
  5. public String postJsonText(@JSONBody String jsonText); 

2. 發送XML數據

  1. /** 
  2.  * 將一個通過JAXB注解修飾過的類型對象解析為XML字符串 
  3.  * 并放在請求的Body進行傳輸 
  4.  */ 
  5. @Post("/message"
  6. String sendXmlMessage(@XMLBody MyMessage message); 
  7.  
  8. /** 
  9.  * 直接傳入一個XML字符串,并放在請求的Body進行傳輸 
  10.  */ 
  11. @Post("/test/xml"
  12. String postXmlBodyString(@XMLBody String xml); 

3. 文件上傳

  1. /** 
  2.  * 用@DataFile注解修飾要上傳的參數對象 
  3.  * OnProgress參數為監聽上傳進度的回調函數 
  4.  */ 
  5. @Post("/upload"
  6. Map upload(@DataFile("file") String filePath, OnProgress onProgress); 

可以用一個方法加Lambda同時解決文件上傳和上傳的進度監聽

  1. Map result = myClient.upload("D:\\TestUpload\\xxx.jpg", progress -> { 
  2.     System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%");  // 已上傳百分比 
  3.     if (progress.isDone()) {   // 是否上傳完成 
  4.         System.out.println("--------   Upload Completed!   --------"); 
  5.     } 
  6. }); 

4. 多文件批量上傳

  1. /** 
  2.  * 上傳Map包裝的文件列表,其中 ${_key} 代表Map中每一次迭代中的鍵值 
  3.  */ 
  4. @Post("/upload"
  5. ForestRequest<Map> uploadByteArrayMap(@DataFile(value = "file", fileName = "${_key}") Map<String, byte[]> byteArrayMap); 
  6.  
  7. /** 
  8.  * 上傳List包裝的文件列表,其中 ${_index} 代表每次迭代List的循環計數(從零開始計) 
  9.  */ 
  10. @Post("/upload"
  11. ForestRequest<Map> uploadByteArrayList(@DataFile(value = "file", fileName = "test-img-${_index}.jpg") List<byte[]> byteArrayList); 

5. 文件下載

下載文件也是同樣的簡單

  1. /** 
  2.  * 在方法上加上@DownloadFile注解 
  3.  * dir屬性表示文件下載到哪個目錄 
  4.  * OnProgress參數為監聽上傳進度的回調函數 
  5.  * ${0}代表引用第一個參數 
  6.  */ 
  7. @Get("http://localhost:8080/images/xxx.jpg"
  8. @DownloadFile(dir = "${0}"
  9. File downloadFile(String dir, OnProgress onProgress); 

調用下載接口以及監聽下載進度的代碼如下:

  1. File file = myClient.downloadFile("D:\\TestDownload", progress -> { 
  2.     System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%");  // 已下載百分比 
  3.     if (progress.isDone()) {   // 是否下載完成 
  4.         System.out.println("--------   Download Completed!   --------"); 
  5.     } 
  6. }); 

6.基本簽名驗證

  1. @Post("/hello/user?username=${username}"
  2. @BasicAuth(username = "${username}"password = "bar"
  3. String send(@DataVariable("username") String username); 

7. OAuth2.0

  1. @OAuth2( 
  2.         tokenUri = "/auth/oauth/token"
  3.         clientId = "password"
  4.         clientSecret = "xxxxx-yyyyy-zzzzz"
  5.         grantType = OAuth2.GrantType.PASSWORD
  6.         scope = "any"
  7.         username = "root"
  8.         password = "xxxxxx" 
  9. @Get("/test/data"
  10. String getData(); 

等等特性,詳細文檔請看:http://forest.dtflyx.com/

七、詳細文檔請看:http://forest.dtflyx.com/

 

責任編輯:姜華 來源: Thinking曹
相關推薦

2025-06-09 02:11:00

2020-03-24 15:15:29

HttpClientOkHttpJava

2022-03-08 13:46:22

httpClientHTTP前端

2022-05-16 07:37:58

SQL 編輯器數據庫管理工具

2012-07-18 10:09:55

輕量級移動客戶端開發類庫

2024-05-09 08:30:57

OkHttpHTTP客戶端

2012-11-28 11:05:42

IBMdW

2012-09-19 14:27:16

Worklight

2021-05-21 10:48:09

http語言開發

2009-06-12 19:18:08

REST客戶端框架JavaScript

2021-10-18 05:00:38

語言GoRequestHTTP

2023-06-27 16:42:18

Tinygrad深度學習工具

2020-11-11 12:13:59

JS

2022-08-10 12:21:07

PythonWebBottle

2022-02-12 21:05:11

異步爬蟲框架

2011-03-02 10:03:44

SaturnJSJS

2013-06-20 10:28:39

MVVM框架avalon架構

2025-03-07 08:57:46

HTTP客戶端框架

2011-08-17 10:10:59

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端
點贊
收藏

51CTO技術棧公眾號

国产在线青青草| 国产高清在线一区| 小嫩苞一区二区三区| 高清一区二区| 亚洲成av人片观看| 亚洲成人一区二区三区| www.久久成人| 日本视频一区二区| 欧美国产日韩在线| 日本一二三不卡视频| caoporn成人| 欧美性感一区二区三区| 免费看欧美黑人毛片| av福利精品| 国产91对白在线观看九色| 国产99久久久欧美黑人| 欧美毛片在线观看| 97精品一区二区| 亚洲精品中文字幕av| 性久久久久久久久久久久久久| 色网在线免费观看| 国产视频不卡在线| 偷拍亚洲色图| 亚洲精品成a人在线观看| 中文字幕色网站| 精品欧美一区二区三区在线观看| 亚洲va欧美va国产va天堂影院| 午夜在线视频免费观看| 91涩漫在线观看| 91丨porny丨国产入口| 99精品国产高清在线观看| 91好色先生tv| 日韩不卡一二三区| 欧日韩不卡在线视频| 国产一国产二国产三| 亚洲视频在线免费| 色偷偷av亚洲男人的天堂| 免费看裸体网站| 亚洲精品国产精品粉嫩| 亚洲国产高潮在线观看| 日本中文字幕有码| 日韩中文字幕视频网| 3atv一区二区三区| 天天干天天色天天干| 99精品国自产在线| 欧美四级电影网| 国产高潮免费视频| av成人在线播放| 欧美视频中文一区二区三区在线观看| 日本三区在线观看| 日韩电影大全网站| 在线免费观看一区| 天天综合网日韩| 色猫猫成人app| 欧美日韩一区二区电影| 婷婷免费在线观看| 国产黄色一区| 日韩一区二区中文字幕| 超碰人人cao| 91精品啪在线观看国产手机 | 18视频在线观看娇喘| 秋霞a级毛片在线看| 综合久久久久综合| 青青草影院在线观看| 直接在线观看的三级网址| 亚洲欧美激情一区二区| 91视频 - 88av| 91九色porn在线资源| 欧美日韩亚洲91| 成人性视频欧美一区二区三区| 日韩三区免费| 7777精品久久久大香线蕉| 杨幂一区二区国产精品| 亚洲小说春色综合另类电影| 亚洲高清福利视频| jizz中文字幕| 欧美在线国产| 欧美在线视频一区| 中文字幕在线播放日韩| 国产精品一区二区在线观看不卡 | 欧美日韩国产一区精品一区| 国产做受高潮69| 在线观看 亚洲| 精品在线你懂的| 国产精品手机视频| 成人在线观看网站| 一级中文字幕一区二区| 男人操女人免费软件| 九九久久国产| 亚洲二区在线播放视频| 91成人在线免费视频| 人人狠狠综合久久亚洲婷| 欧美成人免费全部| 久久国产视频精品| 国产精品一区二区三区99| 国产一区二区久久久| 337p日本欧洲亚洲大胆鲁鲁| 亚洲国产视频直播| 最近中文字幕一区二区| 老牛国内精品亚洲成av人片| 日韩中文字幕免费| 可以免费看的av毛片| 国内成人精品2018免费看| 欧美不卡1区2区3区| 在线观看三级视频| 在线观看欧美黄色| 人妖粗暴刺激videos呻吟| 日韩成人综合| 欧美亚洲国产日本| av免费观看网址| 日本一区二区三区四区 | jizzjizzjizz国产| 国产视频亚洲| 97超级碰碰| 免费在线观看黄色网| 色视频成人在线观看免| 超碰caoprom| 久久久久久免费视频| 国产精品h片在线播放| 隣の若妻さん波多野结衣| 国产精品福利av| 天天影视综合色| 亚洲午夜久久| 8050国产精品久久久久久| 成人av手机在线| 亚洲丝袜美腿综合| 欧美精品久久久久久久久25p| 日本福利一区| 久久久久日韩精品久久久男男| 99久久久国产精品无码网爆 | 国产午夜精品理论片a级探花| 538任你躁在线精品视频网站| 免费在线看一区| 日产精品久久久一区二区| 日韩伦理在线一区| 亚洲国产欧美久久| 男人的天堂一区二区| aaa国产一区| 黄色一级片在线看| 9l亚洲国产成人精品一区二三 | 亚洲国内精品在线| 久久精品99国产精| 国产精品亚洲专一区二区三区| 男女啪啪的视频| 精品亚洲二区| 欧美大奶子在线| 亚洲国产精品久久久久爰性色| 亚洲欧美精品午睡沙发| 日本成人在线免费观看| 欧美午夜影院| 亚洲一区二区三区香蕉| 69xxx在线| 欧美成人精品二区三区99精品| 欧美成人精品一区二区免费看片| 国产成人午夜电影网| 国产在线xxxx| 欧美成人午夜77777| 欧日韩在线观看| 国产女主播在线写真| 欧美色图天堂网| 四虎永久免费地址| 国产精品资源在线观看| 分分操这里只有精品| 精品中文一区| 国产日韩欧美在线看| 亚洲区欧洲区| 亚洲精品国产精品国自产观看浪潮| 精品成人久久久| 久久久蜜桃精品| 午夜久久福利视频| 欧美freesex交免费视频| 国产欧美韩日| 日日夜夜天天综合| 久久不射电影网| 天堂中文字幕在线| 欧美日韩国产免费| 九九在线观看视频| 久久久蜜桃精品| 国产在线视频三区| 亚洲欧美卡通另类91av| 亚洲人成影视在线观看| 日韩一区二区三区高清在线观看| 96精品视频在线| 男人天堂久久久| 亚洲黄一区二区| 一二三四区在线| 精品国产成人在线| 欧美88888| 91老司机福利 在线| 看看黄色一级片| 99精品福利视频| 中文字幕精品—区二区日日骚| 999精品视频在这里| 日韩免费在线视频| 秋霞在线午夜| xxxx性欧美| 精品一二三区视频| 欧美变态tickle挠乳网站| 精品免费囯产一区二区三区| 亚洲日本青草视频在线怡红院| aa片在线观看视频在线播放| 久久国内精品自在自线400部| av日韩一区二区三区| 久久人体视频| 欧美日韩在线精品一区二区三区| 精品视频一区二区三区| 国产精品久久二区| 爱情岛亚洲播放路线| 色综合亚洲精品激情狠狠| 婷婷丁香花五月天| 日韩视频在线观看一区二区| 亚洲视屏在线观看| 懂色av影视一区二区三区| 久草视频在线资源| 亚洲视频资源在线| 亚洲AV无码成人精品区明星换面| av在线这里只有精品| 免费精品99久久国产综合精品应用| 久久精品成人| 免费在线观看视频a| 欧美~级网站不卡| 亚洲自拍偷拍一区二区三区| 成人久久久久| 日本一区二区三区免费看| 欧美理伦片在线播放| 成人av片网址| 亚洲超碰在线观看| 成人在线观看视频网站| 久久99国产精品二区高清软件| 情事1991在线| 69久成人做爰电影| 2019中文字幕全在线观看| 国精一区二区三区| 九九热精品视频| 在线中文字幕电影| 欧美精品免费在线观看| 在线heyzo| 欧美激情综合亚洲一二区| 在线观看wwwxxxx| 欧美精品在线免费| av毛片在线播放| 欧美成人亚洲成人日韩成人| 超碰超碰在线| 欧美精品一二区| 日本成人不卡| 91精品国产乱码久久久久久久久| 国产盗摄——sm在线视频| 亚州av一区二区| 91超碰在线播放| 97香蕉久久超级碰碰高清版 | 狠狠爱在线视频一区| 久久久久久久黄色片| 欧美性猛交xxxx免费看| 无码人妻久久一区二区三区| 91国产丝袜在线播放| 亚洲一区二区色| 91精品国产综合久久精品性色| av男人天堂av| 亚洲成人黄色网址| 视频国产一区二区三区| 伊人久久精品视频| 日本中文字幕在线播放| 九九久久综合网站| 国产一二三在线| 国产精品黄视频| 色悠久久久久综合先锋影音下载| 国产成人精品一区二区三区福利| 丁香综合av| 日韩av在线电影观看| 外国成人免费视频| 欧美一级免费播放| 日韩高清一区二区| 色男人天堂av| 久久青草国产手机看片福利盒子| 国产精品www爽爽爽| 亚洲欧美另类久久久精品| 国产成人啪精品午夜在线观看| 日韩欧美中文在线| 夜夜骚av一区二区三区| 日韩欧美电影在线| 日本韩国精品一区二区| 色综久久综合桃花网| sm在线观看| 国产在线精品播放| 狼人精品一区二区三区在线| 日韩免费三级| 亚洲激情网址| 怡红院亚洲色图| 91亚洲精品久久久蜜桃网站| 国产视频不卡在线| 五月婷婷综合网| 国产精品久久影视| 国产视频久久久久| www.在线视频| 国产精品麻豆va在线播放| 都市激情亚洲欧美| 中文字幕av导航| 天使萌一区二区三区免费观看| xxx中文字幕| 国产欧美日韩另类视频免费观看| 精品少妇theporn| 欧美精品视频www在线观看| 亚洲日本中文字幕在线| 九九精品视频在线观看| 欧美黑粗硬大| 蜜桃麻豆91| 99视频精品| 亚洲免费观看在线| **性色生活片久久毛片| 中文字幕av第一页| 亚洲激情在线观看| 中文字幕有码在线观看| 国产在线观看精品一区二区三区| 国产精品手机在线播放| 国产中文字幕二区| 懂色av一区二区三区免费观看| www.黄色com| 欧美自拍丝袜亚洲| 青青视频在线观| 海角国产乱辈乱精品视频| 精品一区二区三区亚洲| 一区二区三区四区国产| 日韩国产欧美三级| 亚洲成人日韩在线| 午夜一区二区三区视频| 亚洲国产成人在线观看| 久久综合伊人77777| 欧美高清你懂的| 致1999电视剧免费观看策驰影院| 日本网站在线观看一区二区三区| 野花社区视频在线观看| 精品成人国产在线观看男人呻吟| 黄色美女一级片| 久久全国免费视频| 麻豆成人入口| 99热自拍偷拍| 91麻豆视频网站| 男人天堂2024| 在线视频欧美性高潮| 国产精品扒开腿做爽爽爽视频软件| 欧美一区免费视频| 天堂av在线一区| 1024手机在线观看你懂的| 91久久久免费一区二区| 国产露出视频在线观看| 国产成人综合一区二区三区| 欧美日韩精品一区二区视频| 免费看污污网站| 成人免费视频在线观看| 国产成人麻豆精品午夜在线| 欧美丰满片xxx777| 国产伦精品一区二区三区在线播放 | 国产精品视频精品视频| 手机亚洲手机国产手机日韩| 亚洲一区精品视频在线观看| 亚洲男同性视频| 亚洲成熟女性毛茸茸| 性色av一区二区咪爱| 欧美**字幕| 91精产国品一二三产区别沈先生| 亚洲伦在线观看| 少妇高潮久久久| 国产精品99久久久久久www| 婷婷色综合网| av天堂一区二区| 一本大道久久a久久综合婷婷| av黄色在线观看| 999热视频| 国产农村妇女精品一二区| 日本一卡二卡在线播放| 欧美一区二区三区精品| 女厕盗摄一区二区三区| 色涩成人影视在线播放| 国产一区二区免费看| 97免费在线观看视频| 国产亚洲欧美视频| 日韩欧美中文字幕一区二区三区| 日韩中字在线观看| 国产精品午夜在线| 亚洲第一成年人网站| 茄子视频成人在线| 午夜影院欧美| 国产偷人妻精品一区| 欧美乱熟臀69xxxxxx| 成年人黄色大片在线| 亚洲高清精品中出| 成人激情小说网站| 中文字幕一区二区三区免费看| 欧美高清激情视频| 日韩国产欧美一区二区| 折磨小男生性器羞耻的故事| 在线观看网站黄不卡| 国内在线视频| 自拍亚洲欧美老师丝袜| 91免费在线播放| 高h放荡受浪受bl| 成人福利在线视频| 久久久久在线| 国产第一页在线播放| xxx成人少妇69|