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

Spring Boot 不同HTTP客戶端 同步&異步請求對比

開發 前端
我們通過調用 CloseableHttpClient 類上的 execute() 方法對應用程序接口進行同步調用,該方法將使用 StringEntity 實例填充的 HttpPost 對象作為輸入參數。

環境:Spring Boot3.2.5

1. 簡介

超文本傳輸協議(HTTP)是一種用于傳輸超媒體文檔(如HTML)以及標準格式(如JSON和XML)的API數據的應用層協議。

它是應用程序之間通信時常用的協議,這些應用程序以REST API的形式發布其功能。使用Java構建的應用程序依賴某種形式的HTTP客戶端來對其他應用程序進行API調用。

在選擇HTTP客戶端方面存在多種多樣的選項。本文概述了一些主要的庫,這些庫被用作Java應用程序中的HTTP客戶端來進行HTTP請求。

本篇文章將介紹如下幾種HTTP 客戶端:

  1. Java 11及以上版本編寫的應用程序內置了HttpClient
  2. Apache HttpComponents項目的Apache HttpClient
  3. 由Square提供的OkHttpClient
  4. Spring WebFlux中的WebClient

為了覆蓋最常見的場景,我們將查看每種類型的客戶端發送異步HTTP GET請求和同步POST請求的示例。

2. 實戰案例

2.1 準備接口

@RestController
@RequestMapping("/api")
public class ApiController {


  private static List<User> datas = new ArrayList<>() ;
  static {
    datas.addAll(List.of(
        new User(1L, "狗蛋"),
        new User(2L, "観月あかね")
      )) ;
  }
  @GetMapping("/list")
  public List<User> list() {
    return datas ;
  }
  @PostMapping("/save")
  public User save(@RequestBody User user) {
    datas.add(user) ;
    return user ;
  }
}

如上準備了2個接口分別是:GET請求的/list,POST請求的/save。接下來介紹的4個HTTP客戶端都將圍繞這2個接口進行。

2.2 Java HttpClient

原生的HttpClient作為孵化器模塊在Java 9中引入,并在Java 11中作為JEP 321的一部分正式可用。HttpClient替換了自早期Java版本以來JDK中存在的舊版HttpUrlConnection類。它包括以下特性:

  1. 支持HTTP/1.1、HTTP/2和WebSocket
  2. 支持同步和異步編程模型
  3. 以響應式流的方式處理請求和響應體
  4. 支持Cookies

異步GET請求

public static void invoke() throws Exception {


  // 構建客戶端
  HttpClient client = HttpClient.newBuilder()
      .version(Version.HTTP_2)
      .followRedirects(Redirect.NORMAL)
      .build() ;
  // 構造請求對象
  HttpRequest request = HttpRequest.newBuilder()
      .uri(new URI(URLConstants.LIST))
      .GET()
      // 設置超時時間
      .timeout(Duration.ofSeconds(5))
      .build() ;
  // 發送異步請求
  client.sendAsync(request, BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println)
    // 等待請求完成
    .join() ;
}

請求結果

[{"id":1,"name":"狗蛋"},{"id":2,"name":"観月あかね"}]

通過POST請求

對于 HTTP POST 和 PUT,我們會在生成器上調用 POST(BodyPublisher body) 和 PUT(BodyPublisher body) 方法。BodyPublisher 參數有幾種開箱即用的實現方式,可以簡化請求正文的發送,如下示例:

public static void invokePost() {
  try {
    String requestBody = prepareRequest();
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(URLConstants.SAVE))
        .POST(HttpRequest.BodyPublishers.ofString(requestBody))
        // 這里必須設置該header,否則會響應415狀態碼錯誤
        .header(HttpHeaders.CONTENT_TYPE, "application/json")
        .header(HttpHeaders.ACCEPT, "application/json")
        .build();


    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.err.printf("響應結果: %s%n", response.body()) ;
  } catch (Exception e) {
    e.printStackTrace();
  }
}
private static String prepareRequest() throws Exception {
  var objectMapper = new ObjectMapper();
  String requestBody = objectMapper.writeValueAsString(new User(666L, "莉莉"));
  return requestBody;
}

在這里,我們在 prepareRequest() 方法中創建了一個 JSON 字符串,用于通過 HTTP POST() 方法發送請求正文。

接下來,我們將使用構建器模式創建一個 HttpRequest 實例,然后同步調用 REST API。

在創建請求時,我們通過調用 POST() 方法將 HTTP 方法設置為 POST,還通過在 BodyPublisher 實例中封裝 JSON 字符串來設置 API URL 和請求正文。

響應是通過使用 BodyHandler 實例從 HTTP 響應中提取的。

2.3 Apache HttpComponents

HttpComponents 是 Apache 軟件基金會下的一個項目,它包含了一組用于處理 HTTP 的低級 Java 組件。該項目下的組件分為:

  • HttpCore:一組低級的 HTTP 傳輸組件,可以用來構建自定義的客戶端和服務器端 HTTP 服務。
  • HttpClient:基于 HttpCore 的一個符合 HTTP 規范的 HTTP 代理實現。它還提供了可重用的組件,用于客戶端身份驗證、HTTP 狀態管理和 HTTP 連接管理。

引入依賴

<dependency>
  <groupId>org.apache.httpcomponents.client5</groupId>
  <artifactId>httpclient5</artifactId>
  <version>5.4</version>
</dependency>

如果是Spring Boot項目中你無需設置具體的版本,Spring Boot已經自動適配了對應的版本。

異步GET請求

public static void invoke() {


  try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) {
    client.start() ;
    final SimpleHttpRequest request = SimpleRequestBuilder.get()
        .setUri(URLConstants.LIST)
        .build() ;


    Future<SimpleHttpResponse> future = client.execute(request, new FutureCallback<SimpleHttpResponse>() {
      public void completed(SimpleHttpResponse result) {
        String response = new String(result.getBodyBytes(), StandardCharsets.UTF_8) ;
        System.out.printf("result: %s%n", response) ;
      }
      public void failed(Exception ex) {
        System.out.printf("error: %s%n", ex) ;
      }
      public void cancelled() {
      }
    }) ;


    HttpResponse response = future.get() ;
    System.out.printf("code: %s, reason: %s%n", response.getCode(), response.getReasonPhrase()) ;
  }
}

請求結果

code: 200, reason: OK
result: [{"id":1,"name":"狗蛋"},{"id":2,"name":"観月あかね"},{"id":666,"name":"莉莉"}]

在這里,我們通過在一個擴展的 try 塊中使用默認參數實例化 CloseableHttpAsyncClient 來創建客戶端。之后,我們啟動客戶端。

接下來,我們使用 SimpleHttpRequest 創建請求,并通過調用 execute() 方法進行異步調用,同時附加一個 FutureCallback 類來捕獲和處理 HTTP 響應。

同步POST請求

public static void invokePost() throws Exception {
  StringEntity stringEntity = new StringEntity(prepareRequest()) ;
  HttpPost httpPost = new HttpPost(URLConstants.SAVE) ;


  httpPost.setEntity(stringEntity) ;
  httpPost.setHeader("Accept", "application/json") ;
  httpPost.setHeader("Content-type", "application/json") ;


  try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
    String result = httpClient.execute(httpPost, new HttpClientResponseHandler<String>() {
      public String handleResponse(ClassicHttpResponse response) throws HttpException, IOException {
        System.out.printf("code: %s, reason: %s%n", response.getCode(), response.getReasonPhrase()) ;
        return EntityUtils.toString(response.getEntity()) ;
      }
    }) ;
    System.out.printf("result: %s%n", result) ;
  } catch (Exception e) {
     e.printStackTrace() ;
  } 
}
private static String prepareRequest() throws Exception {
  var objectMapper = new ObjectMapper();
  String requestBody = objectMapper.writeValueAsString(new User(666L, "Heyzo"));
  return requestBody;
}

請求結果

code: 200, reason: 
result: {"id":666,"name":"Heyzo"}

在這里,我們在 prepareRequest 方法中創建了一個 JSON 字符串,用于以 HTTP POST 方法發送請求正文。

接下來,我們用 StringEntity 類封裝 JSON 字符串,并將其設置在 HttpPost 類中,從而創建請求。

我們通過調用 CloseableHttpClient 類上的 execute() 方法對應用程序接口進行同步調用,該方法將使用 StringEntity 實例填充的 HttpPost 對象作為輸入參數。

2.4 OKHttpClient

OkHttpClient 是一個開源庫,最初由 Square 于 2013 年發布。

引入依賴

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>4.12.0</version>
</dependency>

目前最新的正式版本是4.12.0(5.x目前是alpha版本)。

異步GET請求

public static void invoke() throws Exception {
  OkHttpClient client = new OkHttpClient.Builder()
      .readTimeout(1000, TimeUnit.MILLISECONDS)
      .writeTimeout(1000, TimeUnit.MILLISECONDS)
      .build() ;


  Request request = new Request.Builder().url(URLConstants.LIST).get().build() ;


  Call call = client.newCall(request) ;
  call.enqueue(new Callback() {
    public void onResponse(Call call, Response response) throws IOException {
      System.out.printf("result: %s%n", response.body().string()) ;
    }
    public void onFailure(Call call, IOException e) {
    }
  }) ;
}

在這里,我們使用構建器模式來設置讀寫操作的超時值,從而定制客戶端。

接下來,我們使用 Request.Builder 創建請求已經配置響應測試。然后,我們在客戶端上進行異步 HTTP 調用,并通過附加回調處理程序接收響應。

通過POST請求

public static void invokePost() throws Exception {
  OkHttpClient client = new OkHttpClient.Builder()
      .readTimeout(1000, TimeUnit.MILLISECONDS)
      .writeTimeout(1000, TimeUnit.MILLISECONDS)
      .build() ;
  // 1.準備發送的請求數據
  String requestBody = prepareRequest() ;
  // 2.創建 Request Body
  RequestBody body = RequestBody.create(requestBody, MediaType.parse("application/json")) ;
  // 3.創建HTTP請求
  Request request = new Request.Builder().url(URLConstants.SAVE).post(body).build() ;


  // 4.同步調用發送請求
  Response response = client.newCall(request).execute() ;
  System.out.printf("result: %s%n", response.body().string()) ;
}

請求結果

result: {"id":666,"name":"Heyzo"}

在這里,通過 prepareRequest() 方法中創建了一個 JSON 字符串,用于以 HTTP POST 方法發送請求正文。

接下來,使用 Request.Builder 創建請求。

然后,在通過 OkHttpClient#newCall() 方法對 API 進行同步調用。

當我們創建一個單一的 OkHttpClient 實例并在應用程序中的所有 HTTP 調用中重復使用它時,OkHttp 的性能最佳。安卓應用程序中常用的 HTTP 客戶端(如 Retrofit 和 Picasso)都使用 OkHttp。

2.5 Spring WebClient

Spring WebClient 是 Spring 5 在 Spring WebFlux 項目中引入的異步、反應式 HTTP 客戶端,用于取代舊版 RestTemplate,在使用 Spring Boot 框架構建的應用程序中進行 REST API 調用。它支持同步、異步和流場景。

引入依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

說明:如果你項目中也引入了starter-web模塊,那么創業的應該還是基于servlet技術棧。我們這里引入webflux就是單純的使用WebClient。

異步GET請求

public static void invoke() {
  WebClient client = WebClient.create() ;
  client.get()
    .uri(URLConstants.LIST)
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(System.err::println) ;
}

請求結果

[{"id":1,"name":"狗蛋"},{"id":2,"name":"観月あかね"},{"id":666,"name":"莉莉"}]

首先使用默認設置創建客戶端WebClient。然后,調用客戶端上的 get() 方法來發送 HTTP GET 請求,調用 uri 來設置 API訪問接口。

通過POST請求

public static void invokePost() throws Exception {
  WebClient client = WebClient.create();
  String result = client
      .post()
      .uri(URLConstants.SAVE)
      .contentType(MediaType.APPLICATION_JSON)
      .body(BodyInserters.fromValue(prepareRequest()))
      .retrieve()
      .bodyToMono(String.class)
      .block() ;
  System.out.printf("result: %s%n", result) ;
}

請求結果

result: {"id":666,"name":"Heyzo"}

在這里,我們在 prepareRequest() 方法中創建了一個 JSON 字符串,然后通過 HTTP POST 方法將該字符串作為請求體發送。

然后,通過retrieve()方法獲取響應結果。

最后我們通過block()阻塞訂閱當前的Mono。

3. 如何選擇

總結如下幾點:

  • 如果你不想添加任何外部庫,對于Java 11及以上的應用程序,Java原生的HttpClient是首選。
  • 對于Spring Boot應用程序,特別是當我們使用響應式API時,Spring WebClient是更推薦的選擇。
  • 當我們需要對HTTP客戶端進行最大程度的自定義和配置靈活性時,可以使用Apache HttpClient。由于其在社區中的廣泛使用,與其他庫相比,它在網上有最豐富的文檔資料。
  • 當我們使用外部客戶端庫時,推薦使用Square的OkHttpClient。正如我們在前面的例子中所見,它功能豐富、高度可配置,并且擁有比其他庫更容易使用的API。
責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2010-05-31 10:11:32

瘦客戶端

2009-11-07 14:57:00

2025-03-14 09:20:46

2021-05-21 10:48:09

http語言開發

2009-11-09 15:49:01

WCF異步調用

2010-02-23 09:58:21

WCF客戶端驗證

2021-10-18 05:00:38

語言GoRequestHTTP

2020-03-24 15:15:29

HttpClientOkHttpJava

2024-10-15 10:28:43

2024-07-31 15:57:41

2011-08-03 10:39:06

IOS程序 HTTP 請求

2021-04-09 10:05:20

OneDrive微軟同步客戶端

2024-09-05 09:41:57

2011-08-17 10:10:59

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2020-01-02 16:30:02

Spring BootJava異步請求

2011-07-21 11:30:19

網關選擇產品

2025-10-15 07:24:34

2023-09-19 22:41:30

控制器HTTP

2011-10-26 13:17:05

點贊
收藏

51CTO技術棧公眾號

亚洲天堂男人的天堂| 久久精品欧美一区二区三区麻豆 | 人妻视频一区二区三区| 亚洲二区在线| 色悠悠久久久久| 久久久无码人妻精品无码| 三妻四妾的电影电视剧在线观看 | 欧美日韩精品综合| 一级黄色片在线| 国内一区二区三区| 亚洲人成网站777色婷婷| 在线不卡一区二区三区| 蜜桃av在线| 亚洲人成网站色在线观看| 不卡视频一区二区| 中文字幕人妻一区二区在线视频| 欧美va天堂在线| 亚洲男人第一av网站| 色综合五月婷婷| 超级碰碰久久| 一区二区久久久久| 涩涩日韩在线| 欧美一级片免费| 国产自产v一区二区三区c| 欧美亚洲另类在线| 九九视频免费观看| 97精品视频| 亚洲欧洲免费视频| 亚洲视频天天射| 日本国产一区| 欧美性高清videossexo| 青青草成人免费在线视频| 色网站免费在线观看| 丁香天五香天堂综合| 91精品在线播放| 国产乱码在线观看| 性xx色xx综合久久久xx| 欧美极品少妇xxxxⅹ免费视频| 亚洲女同二女同志奶水| 国产探花在线精品| 亚洲精品中文字幕有码专区| 国产成人av无码精品| 激情视频亚洲| 91精品国产综合久久国产大片| 无码日韩人妻精品久久蜜桃| 午夜影院在线播放| 亚洲成人av福利| 成人一区二区av| 黄色网在线免费观看| 国产精品久久久久毛片软件| 婷婷亚洲久悠悠色悠在线播放| 久久久精品在线| 波多野在线播放| 免费精品国产| 亚洲欧美日韩天堂| 午夜理伦三级做爰电影| 中日韩免视频上线全都免费| 亚洲欧洲一区| 精品日韩在线观看| 日本中文字幕精品| 日韩高清二区| 日韩精品一区二区三区视频在线观看| 在线a免费观看| 国产精品麻豆| 日韩免费高清av| 扒开伸进免费视频| 欧美wwwwww| 亚洲精品视频二区| 日本成人午夜影院| 成人在线视频免费观看| yw.139尤物在线精品视频| 国精产品视频一二二区| 色喇叭免费久久综合网| 久久激情视频久久| 青青草手机视频在线观看| 欧美婷婷在线| 91精品国产免费久久久久久| 欧美日韩综合一区二区三区| 日本不卡中文字幕| 成人中文字幕在线观看| 国产精品探花视频| 国产一区二区福利| 国产九区一区在线| 久久久资源网| 国产精品高潮呻吟| 国产女教师bbwbbwbbw| 激情黄产视频在线免费观看| 狠狠爱在线视频一区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 欧美暴力调教| 69成人精品免费视频| 午夜福利三级理论电影| 在线观看日韩一区二区| 日韩激情免费| 欧美国产乱视频| 国产原创视频在线| 久久电影网电视剧免费观看| 91久久精品国产91久久性色tv| 国产刺激高潮av| 日韩精品福利一区二区三区| 久久久久久久欧美精品| 欧亚精品中文字幕| 国产丝袜视频在线观看| 久久女同互慰一区二区三区| 国产欧美自拍视频| 成人免费直播| 日韩视频在线一区二区| 国产三级av在线播放| 在线成人激情| 国产精品xxxxx| 成人av手机在线| 欧美激情综合在线| 成人性免费视频| 亚洲欧美在线综合| 亚洲女人被黑人巨大进入al| www.99re7| 亚洲 欧美 中文字幕| 日韩xxx高潮hd| 国产精品久久观看| 欧美一区二区大胆人体摄影专业网站| 一级黄色a毛片| 91在线国内视频| 亚洲中文字幕无码一区二区三区| 欧美暴力调教| 亚洲女人天堂av| 国产手机在线视频| 国产成人午夜高潮毛片| 亚洲欧洲精品一区二区三区波多野1战4 | 国产亚洲无码精品| 国产精品伦理久久久久久| 欧美亚洲视频一区二区| 亚洲国产精品一| 亚洲免费观看高清完整| 黄色手机在线视频| 精品视频黄色| 欧美亚洲第一页| 日本韩国在线观看| 国产激情无套内精对白视频| 在线亚洲精品| 成人区精品一区二区| 麻豆视频在线观看免费网站| 欧洲生活片亚洲生活在线观看| 尤物网站在线观看| 国产综合色产| 成人在线免费观看一区| 黄色大片在线播放| 884aa四虎影成人精品一区| 久久久久亚洲AV成人无在| 葵司免费一区二区三区四区五区| 精品国产乱码久久久久软件| 欧美videossex| 欧美mv日韩mv| 久久精品女人毛片国产| 国产成人精品www牛牛影视| 妞干网这里只有精品| www.成人| 欧美日韩国产成人在线观看| 亚洲AV无码精品自拍| 亚洲一区二区三区视频在线| 中文字幕18页| 最新亚洲一区| 国产亚洲美女精品久久久| 日韩av电影在线播放| 国产三级视频在线播放| 亚洲欧美偷拍另类a∨色屁股| 亚洲妇熟xx妇色黄蜜桃| 在线一区电影| 国产伦精品一区二区三| 三级在线观看视频| 国产一区二区久久精品| 一区二区三区黄| 亚洲精品国产成人久久av盗摄| 久久黄色一级视频| 亚洲日本激情| 色吧亚洲视频| 国产精品va视频| 国产+成+人+亚洲欧洲| 日韩在线免费播放| 欧美日韩在线综合| 欧美人妻一区二区| 久久亚洲精精品中文字幕早川悠里 | 天堂在线一二区| 91久久国产最好的精华液| 精品无码一区二区三区蜜臀| 国产suv精品一区二区883| 日本www在线视频| 全球成人免费直播| 97神马电影| 美女100%一区| 欧美成人亚洲成人| 欧美新色视频| 欧美一区午夜视频在线观看| 亚洲熟女乱综合一区二区| 国产在线视频卡一卡二| 鲁大师成人一区二区三区| 亚洲精品在线视频观看| 欧美视频二区欧美影视| 4k岛国日韩精品**专区| 日本网站在线免费观看视频| 亚洲白拍色综合图区| 日韩人妻精品中文字幕| 亚洲日韩欧美一区二区在线| www.免费av| 国产一区二区0| 无码少妇一区二区三区芒果| 欧美日韩一区二区国产| 四虎永久在线精品免费一区二区| 6080成人| 国产深夜精品福利| 妞干网免费在线视频| 久久亚洲精品国产亚洲老地址| 日本午夜在线| 日韩精品影音先锋| 中文字幕一区二区在线视频| 天天射综合影视| 亚洲综合网在线| 天天综合网天天综合| 久久久国产综合精品女国产盗摄| 日韩av自拍偷拍| 久久久久综合| 国产伦精品一区二区三区四区视频_| 久久中文视频| 欧美一区国产一区| 欧美三级午夜理伦三级在线观看| 91在线|亚洲| 99蜜月精品久久91| 日韩美女在线观看一区| 草草在线视频| 色综合久久久888| 免费av在线播放| 宅男66日本亚洲欧美视频| 午夜视频免费在线| 欧美精品一区二区在线观看| 国产片在线播放| 欧美久久久久久久久| 人妻中文字幕一区二区三区| 色噜噜偷拍精品综合在线| 成人毛片18女人毛片| 亚洲成人你懂的| 国产精品99re| 亚洲国产精品精华液网站| 免看一级a毛片一片成人不卡| 亚洲人成网站影音先锋播放| av成人免费网站| 亚洲视频在线一区| 色婷婷粉嫩av| 亚洲三级视频在线观看| 日本黄色片免费观看| 综合电影一区二区三区 | www.com污| 美女在线观看视频一区二区| 亚洲一区二区三区四区五区xx| 久久电影一区| 日日摸天天爽天天爽视频| 老色鬼久久亚洲一区二区| av免费网站观看| 青青草97国产精品免费观看| 亚洲欧美自拍另类日韩| 精品一区二区久久久| 久久久九九九热| 粉嫩高潮美女一区二区三区| 在线免费看黄色片| 97se亚洲国产综合自在线观| 国产精品亚洲无码| 亚洲天堂一二三| 亚洲高清视频的网址| 久久午夜无码鲁丝片| 亚洲大片一区二区三区| 青青草免费观看视频| 在线一区二区三区四区| 91麻豆国产在线| 欧美一区二区视频免费观看| 丰满人妻一区二区三区免费| 精品亚洲一区二区三区| melody高清在线观看| 久久夜色精品国产亚洲aⅴ| 天堂va在线| 日本成人精品在线| 久久久久久久性潮| 91影院未满十八岁禁止入内| 欧美大片网址| 视频一区国产精品| 伊人久久大香线蕉综合四虎小说 | 国产情侣一区| 超碰超碰在线观看| 懂色av噜噜一区二区三区av| 日韩网站在线播放| 亚洲天堂成人网| 日本少妇久久久| 欧美三级韩国三级日本三斤| 亚洲高清精品视频| 亚洲深夜福利网站| 国产网站在线免费观看| 91精品国产免费久久久久久 | av成人免费观看| 天天久久夜夜| 亚洲精品偷拍视频| 国产日韩欧美一区| 麻豆乱码国产一区二区三区| 国产一级生活片| 色婷婷精品大视频在线蜜桃视频| 国产精品自产拍| 亚洲欧美国产另类| 麻豆福利在线观看| 国产精品久久久久久久久男| 在线精品视频一区| 亚洲午夜精品久久久中文影院av| 99国产精品99久久久久久粉嫩| 国产日韩欧美久久| 久久色.com| 日本一级黄色录像| 欧美精品在线一区二区| 久久久久久久影视| 97视频免费看| 在线日韩成人| 中文字幕欧美日韩一区二区| 久久亚洲精品伦理| 亚洲精品第二页| 一区二区免费在线播放| 国产一区二区三区成人| 亚洲性线免费观看视频成熟| 国产h片在线观看| 波多野结衣精品久久| 天天综合久久| 超碰在线播放91| 久久久精品2019中文字幕之3| 日韩欧美大片在线观看| 欧美大片在线观看一区| 黄色av电影在线观看| 国产精品爽黄69| 国产成人精品999在线观看| 黄色一级在线视频| 成人激情动漫在线观看| 麻豆视频在线观看| 日韩色在线观看| 69xxx在线| 91在线看www| 国产精品成人一区二区不卡| 手机视频在线观看| 精品美女一区| 97久久超碰福利国产精品…| av毛片精品| 91黄色在线看| 成人av网站在线| 中文字幕亚洲精品在线| 日韩av在线免费| 性欧美又大又长又硬| 久久久一本精品99久久精品| 亚洲男人影院| 色婷婷在线影院| 欧美中文字幕久久| lutube成人福利在线观看| 国产精品极品美女粉嫩高清在线| 欧美肉体xxxx裸体137大胆| 欧洲熟妇精品视频| 国产精品理论在线观看| 91无套直看片红桃| 欧美成人激情视频| ccyy激情综合| 黄色一级片播放| 国产欧美一区二区精品久导航 | 久久精品magnetxturnbtih| 国产精品日韩| 久久久久无码精品国产sm果冻| 欧美午夜片在线观看| 麻豆免费在线观看| 91在线精品视频| 亚洲精品欧美| 亚洲а∨天堂久久精品2021| 欧美美女网站色| 色黄网站在线观看| 国产原创精品| 日韩av一二三| 国产在线一卡二卡| 精品99久久久久久| 日韩成人av电影| 国产又黄又爽免费视频| 国产91精品一区二区麻豆网站| 成人免费视频毛片| 一区二区三区视频免费在线观看| 99tv成人影院| 无码专区aaaaaa免费视频| 国产亚洲综合色| www.色婷婷.com| 清纯唯美日韩制服另类| 99久久久久国产精品| 制服丝袜在线第一页| 欧美主播一区二区三区| 羞羞的视频在线看| 欧美综合激情| 成人性生交大片免费看中文| 婷婷激情五月综合| 欧美日本啪啪无遮挡网站| 啪啪亚洲精品| 波多野结衣三级视频| 91成人看片片| 国产蜜臀一区二区打屁股调教| 日韩欧美激情一区二区| 高清国产一区二区| 又色又爽又黄无遮挡的免费视频|