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

国产精品九九九九| 黄色裸体一级片| 日本不卡网站| 国产午夜精品理论片a级大结局| 国产精品美乳一区二区免费| 波多野结衣爱爱视频| 久久99精品久久久久久欧洲站| 色哟哟一区二区三区| mm131午夜| 久久米奇亚洲| 国产成人精品影视| 日本久久久久亚洲中字幕| 亚洲精品国产精品乱码在线观看| 国产精品色在线网站| 欧美三级蜜桃2在线观看| 东北少妇不带套对白| 91社区在线观看| 99久久精品久久久久久清纯| 91久久国产婷婷一区二区| 中文字字幕在线中文| 亚洲精品中文字幕乱码| 国产午夜精品全部视频播放 | bl视频在线免费观看| 国产女主播视频一区二区| 国产传媒一区二区| 99在线观看免费| 男男成人高潮片免费网站| 91精品国产精品| 丰满少妇被猛烈进入一区二区| 亚洲自拍都市欧美小说| 亚洲激情在线视频| 蜜臀aⅴ国产精品久久久国产老师| 欧美a视频在线| 色噜噜夜夜夜综合网| 国产精品无码av在线播放| av免费看在线| 亚洲男人的天堂网| 椎名由奈jux491在线播放| 国产成人天天5g影院在线观看| thepron国产精品| 91久久精品www人人做人人爽 | 久久99精品久久只有精品| 日韩免费在线免费观看| 亚洲精品视频在线观看免费视频| 欧美另类亚洲| 九九九热精品免费视频观看网站| 免费在线观看a级片| 国产精品99久久| 日韩视频免费中文字幕| 国产人与禽zoz0性伦| 久久中文视频| 精品激情国产视频| 紧身裙女教师波多野结衣| 国产大片一区| 久久av在线看| 久久久久久久久精| 狠狠干成人综合网| 97婷婷涩涩精品一区| 狠狠躁夜夜躁人人爽天天高潮| 亚洲黄页一区| 7777kkkk成人观看| 国产91精品一区| 中文亚洲字幕| 国产成人精品免高潮在线观看| 五月婷婷激情视频| 免费成人在线视频观看| 国产一区二区在线播放| 国产特黄一级片| 国产成人亚洲精品狼色在线| 国产精品区一区| 久香视频在线观看| 中文字幕制服丝袜一区二区三区 | 99精品国产高清在线观看| 亚洲第一视频在线| 99精品久久久久久| 日韩中文一区| www红色一片_亚洲成a人片在线观看_| 一区二区三区中文字幕电影 | 日本精品网站| 4438x成人网最大色成网站| 中文字幕制服丝袜| 久草在线成人| 久久伊人色综合| 国产在线视频二区| 丝瓜av网站精品一区二区| 91精品久久久久久久久青青| 亚洲精品18在线观看| 久久亚洲二区三区| 欧美性受黑人性爽| 一区二区电影免费观看| 欧美电影一区二区三区| 强迫凌虐淫辱の牝奴在线观看| 沈樵精品国产成av片| 久久久精品国产网站| 精品成人av一区二区在线播放| 麻豆精品蜜桃视频网站| 国产欧美一区二区在线播放| 1pondo在线播放免费| 亚洲成av人片在www色猫咪| 美女黄色片视频| 国产一区在线电影| 日韩在线观看免费av| 国产小视频在线免费观看| 久久精品国产99久久6| 国产呦系列欧美呦日韩呦| 午夜免费福利在线观看| 舔着乳尖日韩一区| 色黄视频免费看| 精品国产视频| 97涩涩爰在线观看亚洲| 国产白浆在线观看| 国产精品女主播在线观看| 国产乱子伦农村叉叉叉| 午夜日韩影院| 日韩中文字幕久久| 波多野结衣一二区| 99久久久无码国产精品| 日韩在线视频在线| 久久av影院| 在线精品国产欧美| www.国产一区二区| av中文字幕一区| 精品一二三四五区| 精品国产一区二区三区2021| 在线日韩中文字幕| 国产真人无遮挡作爱免费视频| 成人高清视频免费观看| 菠萝蜜视频在线观看入口| 一区二区三区日本视频| 中文字幕亚洲一区| 国产又粗又猛又爽又| 久久综合九色综合97_久久久| 黄色网在线视频| 麻豆国产一区| 久久亚洲成人精品| 国产精品久久久午夜夜伦鲁鲁| 国产精品嫩草影院com| 凹凸日日摸日日碰夜夜爽1| 欧美一区自拍| 韩国三级日本三级少妇99| 超碰人人人人人人| 亚洲影院免费观看| 国产吃瓜黑料一区二区| 黄色成人av网站| 国产精品一区二区不卡视频| 男人天堂亚洲| 亚洲国产成人久久| 日本在线视频免费| 91丨九色丨尤物| 2022亚洲天堂| 欧美男男gaytwinkfreevideos| 欧美亚洲国产视频小说| 精品久久久久一区二区三区 | 亚洲丝袜精品丝袜在线| 亚洲色图偷拍视频| 欧美一区二区| 国产精品免费一区二区三区四区| sis001亚洲原创区| 日韩高清中文字幕| 国产精品露脸视频| 亚洲色图丝袜美腿| 国产综合内射日韩久| 亚洲永久免费精品| 亚洲精品乱码久久久久久蜜桃91| 亚洲人体在线| 国内精品久久久久伊人av| 天天av综合网| 欧美日韩一二三| 亚洲av无码一区二区三区在线| 国产激情视频一区二区三区欧美| 每日在线观看av| 国产一区网站| 91青草视频久久| 麻豆mv在线看| 中文字幕日韩av综合精品| www.成人免费视频| 狠狠干狠狠久久| 激情无码人妻又粗又大| 成人深夜福利app| www.欧美日本| 欧美区亚洲区| 日本不卡一区二区三区在线观看 | 超碰97免费在线| 国产一区二区三区在线免费观看| 国产黄色大片网站| 欧美性69xxxx肥| 午夜免费激情视频| 国产视频一区二区在线| 人妻巨大乳一二三区| 久久国产一二区| 日韩国产精品毛片| 九九视频免费观看视频精品| 91在线网站视频| 韩国主播福利视频一区二区三区| 久久精品一本久久99精品| 天天色棕合合合合合合合| 欧美日韩一区高清| 日韩精品在线免费看| 亚洲三级电影网站| 无码h肉动漫在线观看| 国产精品影视在线观看| 国产精品无码av无码| 欧美人成在线| 中文字幕制服丝袜在线| 天天躁日日躁狠狠躁欧美巨大小说| 国产欧美精品日韩| 春暖花开亚洲一区二区三区| 欧美精品在线免费观看| 91se在线| 国产一区二区三区四区福利| 国模私拍视频在线| 欧美高清一级片在线| 国产免费av一区| 亚洲国产精品一区二区尤物区| 182在线观看视频| 国产亚洲成aⅴ人片在线观看| 国产伦精品一区二区三区精品| 狠狠色综合播放一区二区| 美女网站免费观看视频| 欧美中文日韩| 国产老熟妇精品观看| 自拍欧美日韩| 7777在线视频| 天天天综合网| 一区精品在线| 久久久影院免费| 午夜精品一区二区在线观看的| 欧美黑人巨大videos精品| 超碰97国产在线| 日韩中文字幕无砖| 成人免费网视频| 先锋影音一区二区| 91精品久久久久久久久不口人| 99久久婷婷国产综合精品首页| 日本一本a高清免费不卡| 天堂中文最新版在线中文| 97人人做人人爱| 亚洲精华液一区二区三区| 91sa在线看| 在线成人av观看| 日韩免费视频在线观看| 色豆豆成人网| 国产精品日韩在线一区| 欧美高清xxx| 91精品综合久久久久久五月天| 欧美成人家庭影院| 亚洲一区二区三区在线视频 | 日韩精品久久久久久久玫瑰园| 秋霞av鲁丝片一区二区| 亚洲成人精品视频| 亚洲 另类 春色 国产| 日韩精品视频免费| 久久精品国产亚洲a∨麻豆| 国产亚洲欧美日韩精品| a天堂中文在线| 久久精品2019中文字幕| 91在线中文| 国模叶桐国产精品一区| 欧美性suv| 国产日韩视频在线观看| 美女精品久久| 国产视频在线观看一区| 九九亚洲视频| 美女黄色片网站| 今天的高清视频免费播放成人| 成年人观看网站| 免费看欧美女人艹b| 三级黄色片免费看| heyzo一本久久综合| 免费观看a级片| 亚洲天堂免费在线观看视频| 久久网中文字幕| 色婷婷久久综合| 一级片视频网站| 精品不卡在线视频| 国产鲁鲁视频在线观看免费| 久久视频国产精品免费视频在线| 波多野结衣中文在线| 国产精品96久久久久久| 精品国产亚洲日本| 欧美日韩精品中文字幕一区二区| 日韩片欧美片| 日韩国产一级片| 麻豆freexxxx性91精品| 成人在线电影网站| 中文字幕av一区二区三区| 免费毛片在线播放免费| 日本高清不卡在线观看| 国产特黄一级片| 亚洲视频网站在线观看| 天天色天天射天天综合网| 日韩美女视频中文字幕| 天堂精品久久久久| 亚洲激情啪啪| 国产精品视频久久一区| gai在线观看免费高清| 91丝袜高跟美女视频| 久久av高潮av无码av喷吹| 欧美三级午夜理伦三级中视频| 天天干在线观看| 欧美精品免费看| 国产91欧美| 蜜桃av色综合| 伊人久久大香线蕉av超碰演员| 五月天av在线播放| 久久人人爽爽爽人久久久| 欧美精品一区二区成人| 精品视频一区三区九区| 欧美在线一卡| 97色在线视频观看| 中文无码日韩欧| 亚洲午夜激情| 日韩精品91亚洲二区在线观看| japanese在线观看| 亚洲精品免费在线观看| 国产字幕在线观看| 日韩大陆毛片av| 波多野结衣久久| 成人91免费视频| 中文无码久久精品| 青青草原国产在线视频| 中文欧美字幕免费| 无码aⅴ精品一区二区三区| 亚洲第一网站男人都懂| 免费网站在线观看人| 成人在线视频福利| 91亚洲国产高清| 国产91色在线观看| 国产精品亲子乱子伦xxxx裸| 狠狠狠狠狠狠狠| 亚洲无亚洲人成网站77777| 国产激情在线播放| 精品视频高清无人区区二区三区| 一精品久久久| 欧美污在线观看| 亚洲欧美韩国综合色| 97成人免费视频| 蜜臀久久99精品久久久久久宅男| 99久久这里有精品| 中国 免费 av| 国产精品亚洲视频| 久久99久久98精品免观看软件| 精品国产伦理网| 草草在线视频| 麻豆成人小视频| 日韩国产欧美在线观看| 三区四区在线观看| 精品视频色一区| 国产原创精品视频| 91最新在线免费观看| 狠狠入ady亚洲精品| 变态另类丨国产精品| 欧美性色19p| 大片免费播放在线视频| 国产日韩精品在线播放| 永久91嫩草亚洲精品人人| 日韩精品xxx| 精品国产精品三级精品av网址| 欧美美乳在线| 国产精品视频yy9099| 伊人久久大香线蕉精品组织观看| 伊人av在线播放| 午夜精品久久久久久久久久久| 性感美女视频一二三| 国产成人一区二区三区电影| 成人羞羞网站| 香蕉视频色在线观看| 图片区小说区区亚洲影院| 免费观看成年在线视频网站| 国产精品人成电影在线观看| 欧美成人高清| 久久丫精品国产亚洲av不卡| 欧美少妇一区二区| 亚洲婷婷噜噜| 久久综合福利| 精品午夜久久福利影院| 四虎成人精品永久免费av| 亚洲网站在线播放| 精品一区二区三区四区五区| aa在线观看视频| 中文字幕人成不卡一区| 丰满人妻妇伦又伦精品国产| 国产精品福利小视频| 国产精品大片| 免费看的黄色录像| 欧美精品一区二区三区高清aⅴ| 免费观看一级欧美片| 日韩精品第1页| 久久精品无码一区二区三区| jlzzjlzzjlzz亚洲人| 日本精品久久久久影院| 亚洲综合五月| 少妇久久久久久久久久| 日韩欧美综合一区| 欧美性xxx| 欧美一级免费播放| 国产精品久久久久久久久免费相片| 日韩永久免费视频| 成人黄色中文字幕| 日韩激情视频在线观看|