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

面試官:說說你對 RESTful 的理解?

開發(fā) 后端
在學習RESTful 風格接口之前,即使你不知道它是什么,但你肯定會好奇它能解決什么問題?有什么應用場景?聽完下面描述我想你就會明白。

前言

在學習RESTful 風格接口之前,即使你不知道它是什么,但你肯定會好奇它能解決什么問題?有什么應用場景?聽完下面描述我想你就會明白:

在互聯網并沒有完全流行的初期,移動端也沒有那么盛行,頁面請求和并發(fā)量也不高,那時候人們對接口的要求沒那么高,一些動態(tài)頁面(jsp)就能滿足絕大多數的使用需求。

但是隨著互聯網和移動設備的發(fā)展,人們對Web應用的使用需求也增加,傳統的動態(tài)頁面由于低效率而漸漸被HTML+JavaScript(Ajax)的前后端分離所取代,并且安卓、IOS、小程序等形式客戶端層出不窮,客戶端的種類出現多元化,而客戶端和服務端就需要接口進行通信,但接口的規(guī)范性就又成了一個問題:

所以一套結構清晰、符合標準、易于理解、擴展方便讓大部分人都能夠理解接受的接口風格就顯得越來越重要,而RESTful風格的接口(RESTful API)剛好有以上特點,就逐漸被實踐應用而變得流行起來。

現在,RESTful是目前最流行的接口設計規(guī)范,在很多公司有著廣泛的應用,其中Github 的API設計就是很標準的RESTful API,你可以參考學習。

在開發(fā)實踐中我們很多人可能還是使用傳統API進行請求交互,很多人其實并不特別了解RESTful API,對RESTful API的認知可能會停留在:

  •  面向資源類型的
  •  是一種風格
  •  (誤區(qū))接口傳遞參數使用斜杠(/)分割而不用問號(?)傳參。

而其實一個很大的誤區(qū)不要認為沒有查詢字符串就是RESTful API,也不要認為用了查詢字符串就不是RESTful API,更不要認為用了JSON傳輸的API就是RESTful API。

本篇將帶你了解RESTful并用SpringBoot實戰(zhàn)RESTful API.

一、REST介紹

REST涉及一些概念性的東西可能比較多,在實戰(zhàn)RESTful API之前,要對REST相關的知識有個系統的認知。

REST的誕生

REST(英文:Representational State Transfer,簡稱REST,直譯過來表現層狀態(tài)轉換)是一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。

它首次出現在 2000 年 Roy Thomas Fielding 的博士論文中,這篇論文定義并詳細介紹了表述性狀態(tài)轉移(Representational State Transfer,REST)的架構風格,并且描述了 如何使用 REST 來指導現代 Web 架構的設計和開發(fā)。用他自己的原話說:

我寫這篇文章的目的是:在符合架構原理前提下,理解和評估基于網絡的應用軟件的架構設計,得到一個功能強、性能好、適宜通信的架構。

需要注意的是REST并沒有一個明確的標準,而更像是一種設計的風格,滿足這種設計風格的程序或接口我們稱之為RESTful(從單詞字面來看就是一個形容詞)。所以RESTful API 就是滿足REST架構風格的接口。

Fielding博士答辯 

Fielding博士當時提出的是REST架構在很久的時間內并沒有被關注太多,而近些年REST在國內才變得越來越流行。下面開始詳細學習REST架構特征。

REST架構特征

既然知道REST和RESTful的聯系和區(qū)別,現在就要開始好好了解RESTful的一些約束條件和規(guī)則,RESTful是一種風格而不是標準,而這個風格大致有以下幾個主要特征:

以資源為基礎 :資源可以是一個圖片、音樂、一個XML格式、HTML格式或者JSON格式等網絡上的一個實體,除了一些二進制的資源外普通的文本資源更多以JSON為載體、面向用戶的一組數據(通常從數據庫中查詢而得到)。

統一接口: 對資源的操作包括獲取、創(chuàng)建、修改和刪除,這些操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。換言而知,使用RESTful風格的接口但從接口上你可能只能定位其資源,但是無法知曉它具體進行了什么操作,需要具體了解其發(fā)生了什么操作動作要從其HTTP請求方法類型上進行判斷。具體的HTTP方法和方法含義如下:

  •  GET(SELECT):從服務器取出資源(一項或多項)。
  •  POST(CREATE):在服務器新建一個資源。
  •  PUT(UPDATE):在服務器更新資源(客戶端提供完整資源數據)。
  •  PATCH(UPDATE):在服務器更新資源(客戶端提供需要修改的資源數據)。
  •  DELETE(DELETE):從服務器刪除資源。

當然也有很多在具體使用的時候使用PUT表示更新。從請求的流程來看,RESTful API和傳統API大致架構如下:

URI指向資源:URI = Universal Resource Identifier 統一資源標志符,用來標識抽象或物理資源的一個緊湊字符串。URI包括URL和URN,在這里更多時候可能代指URL(統一資源定位符)。RESTful是面向資源的,每種資源可能由一個或多個URI對應,但一個URI只指向一種資源。

無狀態(tài):服務器不能保存客戶端的信息, 每一次從客戶端發(fā)送的請求中,要包含所有必須的狀態(tài)信息,會話信息由客戶端保存, 服務器端根據這些狀態(tài)信息來處理請求。當客戶端可以切換到一個新狀態(tài)的時候發(fā)送請求信息, 當一個或者多個請求被發(fā)送之后, 客戶端就處于一個狀態(tài)變遷過程中。每一個應用的狀態(tài)描述可以被客戶端用來初始化下一次的狀態(tài)變遷。

REST架構限制條件

Fielding在論文中提出REST架構的6個限制條件,也可稱為RESTful 6大原則, 標準的REST約束應滿足以下6個原則:

  • 客戶端-服務端(Client-Server): 這個更專注客戶端和服務端的分離,服務端獨立可更好服務于前端、安卓、IOS等客戶端設備。
  • 無狀態(tài)(Stateless):服務端不保存客戶端狀態(tài),客戶端保存狀態(tài)信息每次請求攜帶狀態(tài)信息。
  • 可緩存性(Cacheability) :服務端需回復是否可以緩存以讓客戶端甄別是否緩存提高效率。
  • 統一接口(Uniform Interface):通過一定原則設計接口降低耦合,簡化系統架構,這是RESTful設計的基本出發(fā)點。當然這個內容除了上述特點提到部分具體內容比較多詳細了解可以參考這篇REST論文內容。
  • 分層系統(Layered System):客戶端無法直接知道連接的到終端還是中間設備,分層允許你靈活的部署服務端項目。
  • 按需代碼(Code-On-Demand,可選):按需代碼允許我們靈活的發(fā)送一些看似特殊的代碼給客戶端例如JavaScript代碼。

REST架構的一些風格和限制條件就先介紹到這里,后面就對RESTful風格API具體介紹。

二、RESTful API設計規(guī)范

既然了解了RESTful的一些規(guī)則和特性,那么具體該怎么去設計一個RESTful API呢?要從URL路徑、HTTP請求動詞、狀態(tài)碼和返回結果等方面詳細考慮。至于其他的方面例如錯誤處理、過濾信息等規(guī)范這里就不詳細介紹了。

URL設計規(guī)范

URL為統一資源定位器 ,接口屬于服務端資源,首先要通過URL這個定位到資源才能去訪問,而通常一個完整的URL組成由以下幾個部分構成: 

  1. URI = scheme "://" host  ":"  port "/" path [ "?" query ][ "#" fragment ] 

scheme: 指底層用的協議,如http、https、ftp

host: 服務器的IP地址或者域名

port: 端口,http默認為80端口

path: 訪問資源的路徑,就是各種web 框架中定義的route路由

query: 查詢字符串,為發(fā)送給服務器的參數,在這里更多發(fā)送數據分頁、排序等參數。

fragment: 錨點,定位到頁面的資源

我們在設計API時URL的path是需要認真考慮的,而RESTful對path的設計做了一些規(guī)范,通常一個RESTful API的path組成如下: 

  1. /{version}/{resources}/{resource_id} 

version:API版本號,有些版本號放置在頭信息中也可以,通過控制版本號有利于應用迭代。

resources:資源,RESTful API推薦用小寫英文單詞的復數形式。

resource_id:資源的id,訪問或操作該資源。

當然,有時候可能資源級別較大,其下還可細分很多子資源也可以靈活設計URL的path,例如: 

  1. /{version}/{resources}/{resource_id}/{subresources}/{subresource_id} 

此外,有時可能增刪改查無法滿足業(yè)務要求,可以在URL末尾加上action,例如 

  1. /{version}/{resources}/{resource_id}/action 

其中action就是對資源的操作。

從大體樣式了解URL路徑組成之后,對于RESTful API的URL具體設計的規(guī)范如下:

  1.  不用大寫字母,所有單詞使用英文且小寫。
  2.  連字符用中杠"-"而不用下杠"_"
  3.  正確使用 "/"表示層級關系,URL的層級不要過深,并且越靠前的層級應該相對越穩(wěn)定
  4.  結尾不要包含正斜杠分隔符"/"
  5.  URL中不出現動詞,用請求方式表示動作
  6.  資源表示用復數不要用單數
  7.  不要使用文件擴展名

HTTP動詞

在RESTful API中,不同的HTTP請求方法有各自的含義,這里就展示GET,POST,PUT,DELETE幾種請求API的設計與含義分析。針對不同操作,具體的含義如下: 

  1. GET /collection:從服務器查詢資源的列表(數組)  
  2. GET /collection/resource:從服務器查詢單個資源  
  3. POST /collection:在服務器創(chuàng)建新的資源  
  4. PUT /collection/resource:更新服務器資源  
  5. DELETE /collection/resource:從服務器刪除資源 

在非RESTful風格的API中,我們通常使用GET請求和POST請求完成增刪改查以及其他操作,查詢和刪除一般使用GET方式請求,更新和插入一般使用POST請求。從請求方式上無法知道API具體是干嘛的,所有在URL上都會有操作的動詞來表示API進行的動作,例如:query,add,update,delete等等。

而RESTful風格的API則要求在URL上都以名詞的方式出現,從幾種請求方式上就可以看出想要進行的操作,這點與非RESTful風格的API形成鮮明對比。

在談及GET,POST,PUT,DELETE的時候,就必須提一下接口的安全性和冪等性,其中安全性是指方法不會修改資源狀態(tài),即讀的為安全的,寫的操作為非安全的。而冪等性的意思是操作一次和操作多次的最終效果相同,客戶端重復調用也只返回同一個結果。

上述四個HTTP請求方法的安全性和冪等性如下:

HTTP Method 安全性 冪等性 解釋
GET 安全 冪等 讀操作安全,查詢一次多次結果一致
POST 非安全 非冪等 寫操作非安全,每多插入一次都會出現新結果
PUT 非安全 冪等 寫操作非安全,一次和多次更新結果一致
DELETE 非安全 冪等 寫操作非安全,一次和多次刪除結果一致

狀態(tài)碼和返回數據

服務端處理完成后客戶端也可能不知道具體成功了還是失敗了,服務器響應時,包含狀態(tài)碼和返回數據兩個部分。

狀態(tài)碼

我們首先要正確使用各類狀態(tài)碼來表示該請求的處理執(zhí)行結果。狀態(tài)碼主要分為五大類:

1xx:相關信息

2xx:操作成功

3xx:重定向

4xx:客戶端錯誤

5xx:服務器錯誤

每一大類有若干小類,狀態(tài)碼的種類比較多,而主要常用狀態(tài)碼羅列在下面:

200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。

202 Accepted - [*]:表示一個請求已經進入后臺排隊(異步任務)

204 NO CONTENT - [DELETE]:用戶刪除數據成功。

400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。

401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。

403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。

404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。

406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。

410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。

422 Unprocesable entity - [POST/PUT/PATCH] 當創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。

500 INTERNAL SERVER ERROR - [*]:服務器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。

返回結果

針對不同操作,服務器向用戶返回數據,而各個團隊或公司封裝的返回實體類也不同,但都返回JSON格式數據給客戶端。

第三關 一個RESTful API案例

上面講了RESTful理論知識,下面動手實現一個小案例吧!

預備

在本案例的實戰(zhàn)中,我們訪問的RESTful接口都是對數據庫真實的操作,新建數據庫,創(chuàng)建一個數據庫和表(根據自己喜好)。

選擇Maven依賴的時候,只需要勾選其中Spring的Web模塊、MySQL驅動以及MyBatis框架。

本案例的POJO創(chuàng)建Dog.java實體對象,其具體構造為: 

  1. package com.restfuldemo.pojo;  
  2. public class Dog {  
  3.     private int id;//唯一id標識  
  4.     private String name;//名稱  
  5.     private  int age;//年齡  
  6.     //省略get set  

上面創(chuàng)建好了項目,我們就開始構建RESTful風格的API。在具體構建RESTful API的時候,需要對各種請求有更細致的認知,當然,本案例在實現各種請求的時候為了演示的便捷并沒有完全遵循RESTful API規(guī)范,例如版本號等信息這里就不添加了,案例更側重于使用SpringBoot實現這個接口。

本案例實現對dog資源的增刪改查,如下是非RESTful 和RESTful接口對比:

API name 非 RESTful RESTful
獲取dog /dogs/query/{dogid} GET: /dogs/{dogid}
插入dog /dogs/add POST: /dogs
更新dog /dogs/update/{dogid} PUT:/dogs/{dogid}
刪除dog /dods/delete/{dogid} DELETE:/dogs/{dogid}

另外在使用postman進行發(fā)送請求的時候,有三種常用的文件類型傳遞到后端:

form-data :就是form表單中的multipart/form-data,會將表單數據處理為一條信息,用特定標簽符將一條條信息分割開,而這個文件類型通常用來上傳二進制文件。

x-www-form-urlencoded:就是application/x-www-form-urlencoded,是form表單默認的encType,form表單會將表單內的數據轉換為鍵值對,這種格式不能上傳文件。

raw:可以上傳任意格式的文本,可以上傳Text,JSON,XML等,但目前大部分還是上傳JSON格式數據。當后端需要接收JSON格式數據處理的時候,可以采用這種格式來測試。

因為GET請求查詢參數在URL上,其他類型請求使用x-www-form-urlencoded方式向后端傳值。

GET POST PUT DELETE請求

GET請求用來獲取資源:GET請求會向數據庫發(fā)索取數據的請求,從而來獲取資源,該請求就像數據庫的select操作一樣,只是用來查詢數據,不會影響資源的內容。無論進行多少次操作,結果都是一樣的。

并且GET請求會把請求的參數附加在URL后面,但是不同的瀏覽器對其有不同的大小長度限制。

在本案例中,我們設計兩個GET請求的API。

  • GET /dogs :用來返回dog資源的列表。
  • GET /dogs/{dogid} :用來查詢此id的單個dog資源。

POST請求用來新增一個資源 : POST請求向服務器發(fā)送數據,但是該請求會改變數據的內容(新添),就像數據庫的insert操作一樣,會創(chuàng)建新的內容。且POST請求的請求參數都是請求體中,其大小是沒有限制的。

在本案例中,我們設計以下POST請求的API。

POST /dogs :服務端新增一個dog資源。

PUT請求用來更新資源,PUT請求是向服務器端發(fā)送數據的, 與POST請求不同的是,PUT請求側重于數據的修改 ,就像數據庫中update一樣,而POST請求側重于數據的增加。

在本案例中,我們設計以下POST請求的API。

PUT /dogs/{dogid} :用來更新此id的單個dog資源。

DELETE 請求用來刪除資源,DELETE請求用途和它字面意思一致,用來刪除資源。和數據庫中delete相對應。

在本案例中,我們設計以下DELETE請求的API。

DELETE /dogs/{dogid} :用來刪除此id的單個dog資源。

對應的Mapper文件為: 

  1. package com.restfuldemo.mapper;  
  2. import com.restfuldemo.pojo.Dog;  
  3. import org.apache.ibatis.annotations.*;  
  4. import java.util.List;  
  5. @Mapper  
  6. public interface DogMapper {  
  7.     @Select("select * from dog")  
  8.     List<Dog> getAllDog();  
  9.     @Select("select * from dog where id=#{id}")  
  10.     Dog getDogById(@Param("id") int id);  
  11.     @Insert("insert into dog (name,age) values (#{name},#{age})")  
  12.     boolean addDog(Dog dog);  
  13.     @Update("update dog set name=#{name},age=#{age} where id=#{id}")  
  14.     boolean updateDog(Dog dog);  
  15.     @Delete("delete  from dog where id=#{id}")  
  16.     boolean deleteDogById(int id);  

對應controller文件為: 

  1. package com.restfuldemo.controller;  
  2. import com.restfuldemo.mapper.DogMapper;  
  3. import com.restfuldemo.pojo.Dog;  
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.web.bind.annotation.*;  
  6. import java.util.Arrays;  
  7. import java.util.List;  
  8. @RestController  
  9. public class TestController {  
  10.     @Autowired(required = false 
  11.     DogMapper dogMapper;  
  12.     @GetMapping("dogs")  
  13.     public List<Dog> getDogs()  
  14.     {  
  15.         return  dogMapper.getAllDog();  
  16.     }  
  17.     @GetMapping("dogs/{id}")  
  18.     public Dog getDogById(@PathVariable("id") int id)  
  19.     {  
  20.         Dog dog=dogMapper.getDogById(id);  
  21.         return  dog;  
  22.     }  
  23.     @PostMapping("dogs")  
  24.     public boolean addDog(Dog dog)  
  25.     {  
  26.         return dogMapper.addDog(dog); 
  27.     }  
  28.     @PutMapping("dogs/{id}")  
  29.     public boolean updateDog(@PathVariable("id")int id,@RequestParam("name")String name,@RequestParam("age")int age)  
  30.     {  
  31.         Dog dog=dogMapper.getDogById(id);  
  32.         dog.setName(name);  
  33.         dog.setAge(age);  
  34.         return  dogMapper.updateDog(dog);  
  35.     }  
  36.     @DeleteMapping("dogs/{id}")  
  37.     public boolean deleteDog(@PathVariable("id") int id)  
  38.     {  
  39.         return  dogMapper.deleteDogById(id);  
  40.     }  

經過筆者測試一切都是ok的,如果要項目源文件請聯系筆者發(fā)你哈!

總結

RESTful風格的API 固然很好很規(guī)范,但大多數互聯網公司并沒有按照或者完全按照其規(guī)則來設計,因為REST是一種風格,而不是一種約束或規(guī)則,過于理想的RESTful API 會付出太多的成本。

比如RESTful API也有一些缺點

  •  比如操作方式繁瑣,RESTful API通常根據GET、POST、PUT、DELETE 來區(qū)分操作資源的動作,而HTTP Method 本身不可直接見,是隱藏的,而如果將動作放到URL的path上反而清晰可見,更利于團隊的理解和交流。
  •  并且有些瀏覽器對GET,POST之外的請求支持不太友好,還需要特殊額外的處理。
  •  過分強調資源,而實際業(yè)務API可能有各種需求比較復雜,單單使用資源的增刪改查可能并不能有效滿足使用需求,強行使用RESTful風格API只會增加開發(fā)難度和成本。

所以,當你或你們的技術團隊在設計API的時候,如果使用場景和REST風格很匹配,那么你們可以采用RESTful 風格API。但是如果業(yè)務需求和RESTful風格API不太匹配或者很麻煩,那也可以不用RESTful風格API或者可以借鑒一下,畢竟無論那種風格的API都是為了方便團隊開發(fā)、協商以及管理,不能墨守成規(guī)。

到這里RESTful API的介紹和實戰(zhàn)就結束啦,本篇首先從RESTful的一些特點進行介紹,再到SpringBoot實戰(zhàn)RESTful API,最后也說了一些RESTful API并不完美的地方,相信睿智的你對RESTful 一定有了很深刻的理解。在以后項目的API設計上定能有所優(yōu)化。

不同的人對RESTful API可能有著不同的理解,但存在即合理,RESTful API有著其鮮明的優(yōu)勢和特點,目前也是一種API設計的主要選型之一,所以掌握和理解RESTful API還是相當重要的! 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開發(fā)

2020-06-12 15:50:56

options前端服務器

2021-09-16 07:52:18

算法應用場景

2019-05-10 10:50:04

Spring AOPJDK動態(tài)代理CGLIB動態(tài)代理

2021-11-05 07:47:56

代理模式對象

2020-12-04 06:27:04

序列化面試官Java

2021-11-09 08:51:13

模式命令面試

2021-11-10 07:47:49

組合模式場景

2021-11-02 22:04:58

模式

2022-02-21 17:24:18

序列化對象存儲

2021-08-16 08:33:26

git

2021-11-03 14:10:28

工廠模式場景

2021-09-26 10:57:16

集合操作場景

2021-09-27 06:50:04

非線性數據

2021-09-28 07:12:09

測試路徑

2021-11-11 16:37:05

模板模式方法

2021-09-06 10:51:27

TypeScriptJavaScript

2021-08-17 07:15:16

Git RebaseGit Merge面試

2021-11-22 23:50:59

責任鏈模式場景
點贊
收藏

51CTO技術棧公眾號

国产精品天天摸av网| 亚洲久久一区| 欧美猛男超大videosgay| 就去色蜜桃综合| 欧美成人一区二区三区四区| 欧美在线观看视频一区| 6080国产精品一区二区| 91传媒免费视频| 天堂在线中文字幕| 日韩国产欧美一区二区三区| 中文字幕综合在线| 日本人69视频| hd国产人妖ts另类视频| 久久久99精品免费观看不卡| 成人精品久久av网站| 久草视频精品在线| 精品国产91| 精品国一区二区三区| 日韩欧美在线免费观看视频| 国产鲁鲁视频在线观看特色| 国产成人h网站| 国产精品国产三级国产aⅴ9色 | 中文字幕永久免费视频| 欧美aⅴ99久久黑人专区| 日韩国产精品一区| 91性高潮久久久久久久| 中文字幕乱码中文乱码51精品| 国产精品入口麻豆九色| 久久国产欧美精品| 精品毛片在线观看| 日韩在线卡一卡二| 国产69精品久久久| 精品国产视频在线观看| 最新亚洲精品| 精品处破学生在线二十三| 国产三级三级看三级| 女人让男人操自己视频在线观看| 亚洲人123区| 日韩欧美精品久久| 日韩精品系列| 国产成人精品亚洲午夜麻豆| 国产主播喷水一区二区| 日韩免费av网站| 欧美一区=区| 91av在线免费观看| 国产精品.www| 一区在线免费| 欧美大片网站在线观看| 欧美特黄一级片| 日韩一区二区中文| 中文字幕最新精品| 成人信息集中地| 日韩精品欧美激情一区二区| 一区二区三区高清国产| 精品成人av一区二区三区| 欧美巨大xxxx| 亚洲精品美女在线观看| 男男做爰猛烈叫床爽爽小说| 国产伦乱精品| 亚洲国产欧美自拍| 偷偷色噜狠狠狠狠的777米奇| 一区二区视频| 精品裸体舞一区二区三区| 中文字幕99页| 美女av一区| 亚洲精品久久久久久久久久久| 国产精品扒开腿做爽爽爽a片唱戏| 哺乳一区二区三区中文视频 | 欧美一区电影| 日韩一区二区久久久| 97精品在线播放| 一本一道久久综合狠狠老| 久久福利视频导航| 久久国产露脸精品国产| 精品1区2区3区4区| 97国产真实伦对白精彩视频8| 欧美精品亚洲精品日韩精品| 蜜桃伊人久久| 成人精品视频久久久久| www.五月婷婷| 91麻豆精东视频| 亚洲成人第一| 伊人影院在线视频| 都市激情亚洲色图| 欧美精品第三页| 国精品产品一区| 日韩免费视频一区二区| 99re久久精品国产| 欧美在线色图| 久久99精品久久久久久琪琪| 亚洲精品午夜国产va久久成人| 久久一二三区| 91九色露脸| 欧美日韩免费做爰大片| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩污视频在线观看| 视频精品一区二区| 亚洲综合日韩在线| 香蕉视频免费看| 国产精品色在线| 国产欧美日韩小视频| 免费污视频在线一区| 日韩午夜av一区| 亚洲激情视频小说| 欧美精品九九| 国产精品九九九| 亚洲av少妇一区二区在线观看 | 91精品国产91综合久久蜜臀| 中文在线一区二区三区| 亚洲一区在线| 国产成人精品一区二区三区| 成 人 免费 黄 色| 国产欧美日本一区二区三区| 亚洲色欲久久久综合网东京热| 巨胸喷奶水www久久久免费动漫| 精品免费一区二区三区| 国产午夜精品福利视频| 99精品99| 999国产在线| 日本美女高清在线观看免费| 欧美午夜影院在线视频| 老女人性生活视频| 日韩精品不卡一区二区| 欧美一区二区三区精品电影| 国产成人免费看一级大黄| 国产女同互慰高潮91漫画| 欧美精品久久久久久久自慰| 国产精品国产亚洲精品| 中文字幕在线观看亚洲| 69亚洲精品久久久蜜桃小说| 成人黄色一级视频| 免费日韩在线观看| 亚洲日日夜夜| 色噜噜狠狠狠综合曰曰曰| 日日噜噜噜噜人人爽亚洲精品| 成人一区二区三区中文字幕| 日韩中文在线字幕| av日韩久久| 精品国产一区久久久| 一区二区视频在线免费观看| 国产日韩一级二级三级| 狠狠爱免费视频| 欧美日韩一本| 久久久久久午夜| 亚洲狼人综合网| 亚洲一区二区在线播放相泽| 国产大片一区二区三区| 91精品天堂福利在线观看| 国产日韩av在线| 在线视频自拍| 欧美精品在线一区二区三区| 影音先锋男人资源在线观看| 免费人成精品欧美精品 | 四虎8848精品成人免费网站| 国产精品久久久久久久久男| 男人天堂综合| 色婷婷久久99综合精品jk白丝| 亚洲专区区免费| 先锋影音久久| 日韩av一区二区三区在线观看| 久久精品女人天堂av免费观看| 悠悠资源网亚洲青| 岛国精品视频在线播放| 人妻丰满熟妇aⅴ无码| 国产亚洲精品bv在线观看| 黑人巨大精品欧美一区二区小视频| 国产丝袜在线观看视频| 亚洲精品国产精品乱码不99按摩| 69成人免费视频| 久久精品人人做人人综合| 不卡av免费在线| 日韩在线欧美| 亚洲最大福利网站| av3级在线| 亚洲视频欧洲视频| 欧美性受xxx黑人xyx性爽| 国产精品三级电影| 无码国产精品久久一区免费| 亚洲精品九九| 日产国产精品精品a∨| 懂色aⅴ精品一区二区三区| 久久亚洲综合国产精品99麻豆精品福利 | 5278欧美一区二区三区| 国产一二在线观看| 91精品久久久久久久99蜜桃| 久久久一二三区| 久久免费的精品国产v∧| 中文字幕第17页| 亚洲国产影院| 亚洲三级一区| 久久综合社区| 国产一区二区视频在线观看| 黄色影院在线看| 一区二区在线视频| www.亚洲欧美| 欧美综合天天夜夜久久| 青青草免费av| 国产精品网友自拍| 菠萝菠萝蜜网站| 国产在线精品一区二区不卡了| 阿v天堂2018| 97精品视频在线看| 久久av一区二区三区漫画| 欧美在线一级| 欧美做爰性生交视频| a视频在线观看| 亚洲天堂av在线播放| 亚洲AV无码一区二区三区少妇| 色视频欧美一区二区三区| 福利所第一导航| 欧美国产日产图区| 香港三级日本三级| 国产精品一区二区在线看| 免费在线观看的毛片| 亚洲二区精品| 水蜜桃在线免费观看| 日本精品黄色| 欧美一级二级三级九九九| 91精品入口| 亚洲综合小说区| 国产精品一区二区免费福利视频| 2021国产精品视频| 丁香花视频在线观看| 久久激情视频久久| 国产女人在线视频| 日韩久久午夜影院| 欧美熟妇另类久久久久久不卡| 欧美美女一区二区| 国产精品国产精品国产| 欧美日韩国产中文字幕| 久久久久久久久久久网 | 日韩第一页在线| 精品人妻少妇嫩草av无码专区| 精品视频在线视频| 久久久国产免费| 色综合久久综合| 成人精品在线看| 午夜精品aaa| 亚洲国产精一区二区三区性色| 亚洲卡通欧美制服中文| 国产激情无码一区二区三区| 国产精品久久久久影视| 欧美aaa级片| 国产精品欧美久久久久一区二区| 国产真实乱人偷精品人妻| 久久伊人蜜桃av一区二区| xxxx黄色片| 99久久精品国产一区| 日本一卡二卡在线| 暴力调教一区二区三区| 日韩av无码一区二区三区不卡| 国产不卡视频在线播放| 日批免费观看视频| 成人18视频在线播放| 熟妇人妻久久中文字幕| 99re视频精品| 亚洲第一香蕉网| 国产日产欧美一区| 我想看黄色大片| 亚洲色图欧洲色图| 外国一级黄色片| 亚洲一二三四久久| 日韩av片在线播放| 欧美性生交xxxxx久久久| 亚洲自拍一区在线观看| 欧美日韩综合在线免费观看| 伊人网视频在线| 91麻豆精品国产91久久久使用方法 | 久久精品国产99精品国产亚洲性色| 日本中文字幕在线一区| 精品综合在线| 超碰成人久久| 国产又粗又大又爽的视频| 黑人一区二区| 18岁网站在线观看| 欧美aaaaa成人免费观看视频| 日本在线播放一区二区| 懂色av一区二区三区免费看| 污污内射在线观看一区二区少妇| 91在线观看下载| 久久久国产一级片| 一区二区三区在线不卡| www.av麻豆| 欧美日韩国产精选| 亚洲不卡免费视频| 亚洲欧洲av一区二区| 黄色免费在线观看网站| 午夜精品福利在线观看| 欧美影视资讯| 99视频在线播放| 色棕色天天综合网| 国产一区二区三区在线免费| 欧美亚洲一级| 丰满少妇一区二区三区专区| 26uuu亚洲综合色欧美| 国产成人免费在线观看视频| 亚洲成人自拍一区| 在线观看免费高清视频| 日韩一区二区三区视频| 免费黄网站在线观看| 精品自在线视频| 成人va天堂| 国产精品日韩欧美一区二区三区| 精品无人区麻豆乱码久久久| 国产片侵犯亲女视频播放| 日本女优在线视频一区二区| 精品久久久久久无码人妻| 国产精品国产三级国产aⅴ无密码| 国产成人一区二区三区影院在线 | 1769国产精品| 精品久久亚洲| 亚洲精品人成| 久久精品主播| 成人午夜精品无码区| 国产精品麻豆网站| 国产区一区二区三| 亚洲精品在线免费播放| 黄色成人在线观看| 国产精品久久久久久久app| 麻豆成人入口| 久久精品xxx| 国产精品一区不卡| 国产wwwwxxxx| 欧美自拍丝袜亚洲| 天堂91在线| 97在线观看免费| 高清日韩欧美| 国产一区 在线播放| 精品无码三级在线观看视频| 级毛片内射视频| 色综合一区二区三区| 色婷婷激情五月| 欧美精品福利视频| 麻豆国产一区| 免费看av软件| 精品一区二区在线观看| 人妻无码一区二区三区免费| 在线欧美一区二区| 国产精品久久久久久久龚玥菲 | 一区二区三区四区免费观看| 久久精品二区亚洲w码| 最新中文字幕av| 欧洲av一区二区嗯嗯嗯啊| 免费在线性爱视频| 欧洲亚洲妇女av| 精品在线观看入口| 久久国产亚洲精品无码| 91小视频免费观看| 精品美女久久久久| 亚洲精品视频免费| 中文字幕在线中文字幕在线中三区| 狠狠色狠狠色综合人人| 国产情侣久久| 一级片手机在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 国产在线观看黄| 国产精品一区=区| 性xxxx欧美老肥妇牲乱| 久国产精品视频| 亚洲柠檬福利资源导航| 超碰免费在线97| 亚州国产精品久久久| 天天躁日日躁狠狠躁欧美巨大小说| 国产精品免费入口| 国产日韩影视精品| 国产美女免费视频| 欧美激情欧美狂野欧美精品| 国产毛片久久久| 久草综合在线观看| 中文字幕一区二区三区蜜月| 999国产精品视频免费| 欧美激情网站在线观看| 神马日本精品| 日本不卡一区在线| 一区二区三区在线免费播放| 天堂在线资源8| 国产成人综合一区二区三区| 五月天激情综合网| 99热超碰在线| 91福利在线免费观看| 男人天堂久久久| 国产一区二区精品在线| 日韩av中文字幕一区二区三区| 99久久99久久精品国产| 日韩经典一区二区三区| 51一区二区三区| 国产毛片久久久久久国产毛片| 久久久久久麻豆| 国产精品高潮呻吟av| 136fldh精品导航福利| 888久久久| 加勒比一区二区| 欧美一级欧美三级在线观看| 亚洲天堂资源| 天堂av免费看| 久久久精品国产99久久精品芒果| 国产精品久久久久久69| 热99在线视频| 欧美影视一区| 影音先锋男人在线|