久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

REST设计模式简介

發布時間:2024/9/30 asp.net 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 REST设计模式简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://www.cnblogs.com/loveis715/p/4669091.html

REST簡介

  一說到REST,我想大家的第一反應就是“啊,就是那種前后臺通信方式。”但是在要求詳細講述它所提出的各個約束,以及如何開始搭建REST服務時,卻很少有人能夠清晰地說出它到底是什么,需要遵守什么樣的準則。

  在您將看到的這一篇文章中,我們將對REST,尤其是基于HTTP的REST服務進行詳細地介紹。通過這些文章,您不僅可以了解到什么是REST,更能清晰地了解到您在編寫REST服務時所需要遵守的各個守則,設計RESTful API時需要考慮的各種因素以及實現過程中可能遇到的問題等內容。

?

REST示例

  我想,很多讀者可能并不太清楚REST到底是一個什么概念。那么,首先讓我們來看一個簡單的基于HTTP的REST服務示例。

  假設用戶正在訪問一個電子商務網站www.egoods.com。該網站對其所銷售的各個物品進行了詳細分類。當用戶登錄該網站進行購物時,他首先需要在該網站上選擇其所需要尋找物品的分類,進而列出屬于該分類的各個物品。

  當然,雖然從業務邏輯的角度來說這個流程非常簡單,但實際上瀏覽器向后臺發送了多個請求:頁面邏輯在頁面加載時將首先得到所有的商品分類,并將這些分類顯示在了頁面中。在用戶選擇了一個分類的時候,頁面邏輯將發送一個請求得到該分類的詳細信息,并發送另外一個請求來得到該分類的商品列表:

  在通過瀏覽器的調試功能查看這些請求的時候,我們可以看到其首先向www.egoods.com/api/categories發送一個GET請求,以取得所有的商品分類:

GET /api/categories Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json

  而服務端將返回所有的類別:

HTTP/1.1 200 OKContent-Type: application/jsonContent-Length: xxx[{"label" : "食品","url" : "/api/categories/1"}, {"label" : "服裝","url" : "/api/categories/2"}...{"label" : "電子設備","url" : "/api/categories/25"} ]

  該響應返回了一個用JSON表示的數組。該數組中的每個元素包含了兩部分信息:用戶能夠讀懂的表示分類名稱的label以及相應分類所對應的URL。其中Label所記錄的分類名稱將在頁面中顯示給用戶。而在用戶根據label所標示的分類名選擇了一個分類的時候,頁面邏輯會取得該分類所對應的URL并向該URL 發送請求,以得到該分類的詳細信息。例如在用戶點擊了“食品”這個分類的時候,瀏覽器將會向服務器發送如下的請求:

GET /api/categories/1 Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json

  這一次,頁面邏輯根據用戶對分類的選擇“食品”來得到了其所對應的URL,并向該URL發送了一個GET請求。而該請求所得到的響應則為:

HTTP/1.1 200 OK Content-Type: application/json Content-Length: xxx{"url" : "/api/categories/1","label" : "Food","items_url" : "/api/items?category=1","brands" : [{"label" : "友臣","brand_key" : "32073","url" : "/api/brands/32073"}, {"label" : "樂事","brand_key" : "56632","url" : "/api/brands/56632"}...],"hot_searches" : … }

  該響應略為復雜。首先,響應中的URL標示了“食品”分類所對應的URL。而label屬性則和前面一樣,用來在頁面上顯示分類的名稱。一個較為特殊的屬性則是items_url。其用來標示獲取屬于食品分類的各個產品的URL。而屬性brands則用來列出在“食品”分類中的著名品牌,例如友臣,樂事等。這些品牌被組織為一個對象數組,而數組中的每個對象都擁有label,url等屬性。在這些屬性的幫助下,頁面可以列出這些著名品牌的名稱,并允許用戶通過點擊跳轉到這些品牌所對應的頁面上。除了這些屬性之外,Food分類還包含了其它一系列屬性,如表示當前其它用戶正在搜索的hot_searches屬性等,這里就不再贅述。

  該響應有一個問題,那就是符合用戶篩選條件的各個產品并沒有包含在該響應中。這是因為頁面所列出的各個產品是根據用戶所設置的篩選條件,即其選擇的品牌以及搜索關鍵字而變化的。因此,頁面邏輯會根據屬性items_url以及用戶所設定的搜索條件組合成為目標URL,再次發送請求到后臺,以請求需要在頁面中展現的各個物品。

  例如用戶在只想瀏覽屬于樂事品牌的食品時,其可以鉤選樂事這個品牌,那么此時的URL將由食物分類的items_url以及表示按照品牌進行篩選的URL參數共同組成:

GET /api/items?category=1&brand_key=56632 Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json

  現在讓我們來總結一下上面所展示的基于HTTP的REST系統的整個運行流程。在開始的時候,我們拿到了所有分類的列表。列表中的各個條目不僅僅包含了用戶可以看到的分類名稱等信息,更擁有一個額外的URL屬性。在用戶選擇該列表中的一項時,頁面邏輯將會向對應的URL發送一個請求,以獲得該項目的詳細信息。在這個詳細信息中,一些內容又包含了一些其它的URL,從而使得頁面邏輯又能通過該URL屬性發送請求。

  您也許會說,哎,這不和我們現有系統的運行流程一樣的嘛。是的。在上面所舉出的例子中,我們也更偏重地描述了REST系統所需要具有的HATEOAS(Hypermedia As The Engine Of Application State)特性。正是由于這個特性已經在大家所創建的系統里面廣泛地使用了,因此我更希望從熟悉的地方入手,而不是開始就非常教條地說REST一定要這樣,一定要那樣,徒增了學習的難度。

  反過來說,上面所展示的REST服務并不具有典型性。在充分了解了REST后,您會發現,REST在系統設計上的視角將不再把流程放在了最優先的位置。

  而在后面的章節中,我們則會逐漸展開,詳細地介紹如何創建一個純正的基于HTTP的REST服務。

REST的定義

  OK,現在讓我們來看看REST的定義。Wikipedia是這樣描述它的:

Representational State Transfer (REST) is a software architecture style consisting of guidelines and best practices for creating scalable web services. REST is a coordinated set of constraints applied to the design of components in a distributed hypermedia system that can lead to a more performant and maintainable architecture.

  從上面的定義中,我們可以發現REST其實是一種組織Web服務的架構,而并不是我們想象的那樣是實現Web服務的一種新的技術,更沒有要求一定要使用HTTP。其目標是為了創建具有良好擴展性的分布式系統。

  反過來,作為一種架構,其提出了一系列架構級約束。這些約束有:

  • 使用客戶/服務器模型。客戶和服務器之間通過一個統一的接口來互相通訊。
  • 層次化的系統。在一個REST系統中,客戶端并不會固定地與一個服務器打交道。
  • 無狀態。在一個REST系統中,服務端并不會保存有關客戶的任何狀態。也就是說,客戶端自身負責用戶狀態的維持,并在每次發送請求時都需要提供足夠的信息。
  • 可緩存。REST系統需要能夠恰當地緩存請求,以盡量減少服務端和客戶端之間的信息傳輸,以提高性能。
  • 統一的接口。一個REST系統需要使用一個統一的接口來完成子系統之間以及服務與用戶之間的交互。這使得REST系統中的各個子系統可以獨自完成演化。
  •   如果一個系統滿足了上面所列出的五條約束,那么該系統就被稱為是RESTful的。

      下面我們再次通過電子商務網站egoods這個示例來幫助我們理解這些約束。首先,egoods是一個電子商務網站。用戶需要通過瀏覽器,手機或者網站所發布的瀏覽應用來訪問該網站的內容。因此其使用的自然是客戶/服務器模型。而在瀏覽過程中,用戶需要訪問不同類型的數據,如商品描述、購物車等信息。這些信息可能由egoods網站服務中不同的服務器來提供的,因此在用戶瀏覽過程中可能需要與不止一個服務器進行交互。如果在服務端保存了有關客戶的任何狀態,那么在用戶與不同服務器進行交互的時候,客戶的狀態就需要在這些服務之間進行同步,大大地增加了系統的復雜度。因此,REST要求客戶端自行維護狀態,并在每次發送請求的時候提供自身所儲存的處理該請求所必需的信息。而恰當地使用緩存這一條也非常容易理解。在客戶端請求一個自上次請求后沒有發生過變化的信息時,如產品分類列表,服務端僅僅需要返回一個304響應即可。

      這里您可以看到,前四條約束中除了無狀態這條約束較為特別之外,其它三條約束在基于HTTP的Web服務中都很常見,也較容易達成。而無狀態約束在其它類型的Web服務中并不十分常見,因此如何避免違反該約束是在實現REST服務時最常討論的話題。其不僅僅會影響到很多功能的設計,更是REST系統擴展性的關鍵。因此在后面的章節中,我們會對無狀態約束單獨進行講解。

      在簡單地介紹了前四個約束之后,我們就需要著重講解統一接口這個約束了。可以說,前面的四個約束實際上都較為容易達成。唯一需要注意的無非是是否某些技術實現違反了這些約束。而第五條約束,統一接口,可以說是REST服務設計的核心所在,也是決定REST服務設計的成敗之處。在實現一個基于HTTP的REST服務時,軟件開發人員不僅僅需要考慮REST所設置的一系列約束,更需要考慮HTTP各組成的語意,HTTP相關技術如何與REST服務約束結合,如何保持前后向兼容性以及如何進行版本管理等問題,才能給出一個自然的,具有較高易用性和較強生命力的REST系統。

      而在介紹統一接口約束之前,我們則需要了解一下和REST密切相關的兩個名詞:資源和狀態。可以說,資源是REST系統的核心概念。所有的設計都會以資源為中心,包括如何對資源進行添加,更新,查找以及修改等。而資源本身則擁有一系列狀態。在每次對資源進行添加 ,刪除或修改的時候,資源就將從一個狀態轉移到另外一個狀態。

      比如說,在egoods中,商品的分類就是一種資源。該資源有很多實例,包括表示食品的分類,其所對應的URL是“/api/categories/1”。同樣地,食品的品牌也是一種資源。這些資源的實例都對應著一個當前的狀態。在修改了一個資源實例之后,比如修改了食品分類中的熱搜關鍵字,那么其將對應著一個新的狀態。這種狀態之間的變化被稱為是狀態的轉移。

      在大概了解了REST系統中的資源和狀態的定義后,我們來看看統一接口這個約束。該約束又包含了四個子約束:

  • 每個資源都擁有一個資源標識。每個資源的資源標識可以用來唯一地標明該資源。
  • 消息的自描述性。在REST系統中所傳遞的消息需要能夠提供自身如何被處理的足夠信息。例如該消息所使用的MIME類型,是否可以被緩存等。
  • 資源的自描述性。一個REST系統所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息,如如何對資源進行添加,刪除以及修改等操作。也就是說,一個典型的REST服務不需要額外的文檔對如何操作資源進行說明。
  • HATEOAS。即客戶只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息,如到底是向哪個URL發送請求等。也就是說,一個典型的REST服務不需要額外的文檔標示通過哪些URL訪問特定類型的資源,而是通過服務端返回的響應來標示到底能在該資源上執行什么樣的操作。一個REST服務的客戶端也不需要知道任何有關哪里有什么樣的資源這種信息。
  •   現在,讓我們仍然以egoods作為示例來解釋一下上面四個子約束。

      在前面的章節中,我們已經看到了從egoods所返回的表示食品這個分類的響應:

    HTTP/1.1 200 OKContent-Type: application/jsonContent-Length: xxx{"url" : "/api/categories/1","label" : "Food","items_url" : "/api/items?category=1","brands" : [{"label" : "友臣","brand_key" : "32073","url" : "/api/brands/32073"}, {"label" : "樂事","brand_key" : "56632","url" : "/api/brands/56632"}...],"hot_searches" : …}

      首先我們看到的是,該響應通過Content-Type響應頭來標示響應中所包含的信息是按照JSON格式來組織的。在看到了該響應頭中所標示的格式之后,消息的接收方就可以按照JSON的格式理解或分析該響應中的負載。這也便是消息的自描述性。

      當然,消息的自描述性不僅僅包含如何解析其所攜帶的負載。在一個基于HTTP的REST系統中,我們可以通過使用大部分HTTP標準所提供的功能來提高消息的自描述性。由于這些功能已經擁有了完備的文檔,被廣大的軟件開發人員所熟知,并得到了眾多瀏覽器廠商以及Web類庫的支持,因此根據這些標準實現REST服務具有較高的消息自描述性。舉例來說,如果在請求中標明了If-Modified-Since頭,那么服務端將可能返回一個304 Not Modified響應。在看到該響應的時候,瀏覽器或其它瀏覽工具可以從緩存中取得上一次得到的結果。因此,在一個基于HTTP的REST系統中,如何準確地使用HTTP協議是一項非常重要的內容。

      在獲知了如何對響應所攜帶的負載進行解析之后,我們就來看看資源的自描述性。在上面的示例中,服務端響應使用了JSON表示了食品分類。該表示首先通過label屬性描述了自己是一個什么分類。接下來,其通過brands屬性表示了該分類中的著名品牌,并通過hot_searches標示了在該分類中的熱搜關鍵字。可以看到,該負載中的所有屬性都清晰地描述了自身所表達的含義。

      那在該資源表示中的url屬性是什么意思?實際上這是為子約束“每個資源都擁有一個資源標識”所添加的一個屬性。該子約束要求每個資源的資源標識可以用來唯一地標明該資源。對于網絡應用來說,資源標識就是URI。而在一個基于HTTP的系統中,最自然的資源標示便是URL。在表示單個資源的時候,這個URL常常會包含著資源在該類資源中的ID。

      在本文的其它章節中,我們就將以這種方式來區分URL和ID:URL用來指向資源所在的地址,而ID則表示該資源在該類型資源中的ID。請讀者一定要記得這兩個術語所對應的不同意義,以防止理解錯誤。

      現在還有一部分食品分類表示中的屬性沒有被講解,那就是在該表示中的各個URL。這是為子約束HATEOAS服務的。在用戶看到items_url屬性時,其就可以通過向該URL發送GET消息得到屬于食品分類中的所有商品的列表。而在商品品牌的表示中也擁有一個url屬性。也就是說,向該URL發送一個GET請求也能夠得到相應品牌的詳細信息。

      您可能會問:既然在介紹HATEOAS時說REST服務并不需要文檔來告訴用戶哪里擁有什么樣的資源,那用戶應該如何知道向/api/categories發送GET請求就能得到所有的分類呢?標準的做法則是向/api直接發送一個GET請求:

    GET /api Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json

      而在返回的響應中將標示出REST API的版本以及所有可以訪問的資源等信息:

    HTTP/1.1 200 OKContent-Type: application/jsonContent-Length: xxx{"version": "1.0","resources": [{"label" : "Categories","description" : "Product categories","uri": "/api/categories"}, {"label" : "Items","description" : "All items on sell","uri": "/api/items"}]}

      可以看到,在該響應中列出了可以被訪問的兩種資源:表示商品分類的Categories以及表示商品的Items。在需要訪問特定類型的資源時,軟件開發人員可以通過直接向這兩種資源所對應的URI發送GET請求即可。

      OK,相信現在讀者已經了解了REST服務所提供的各種約束。那么在后面的章節中,我們將會逐步講解如何設計一個基于HTTP的REST服務。

    資源識別

      在一般情況下,對資源的識別通常都是REST服務設計的第一步。在準確地識別出了各資源之后,怎么用HTTP規范中的各組成來表示這些資源便是順理成章的事情。在本節中,我們將對如何識別REST系統中的資源進行講解。

      在通常的軟件開發過程中,我們常常需要分析達成某個目標所需要使用的業務邏輯,并為業務邏輯的執行提供一系列運行接口。在一些Web服務中,這些接口常常表達了某個動作,如將商品放入購物車,提交訂單等。這一系列動作組合在一起就可以組成完成目標所需要執行的業務邏輯。在需要調用這些接口的時候,軟件開發人員需要向這些接口所在的URL發送一個請求,從而驅使服務執行該動作。

      而在REST服務中,我們所提供的各個接口則需要是一系列資源,而業務邏輯需要通過對資源的操作來完成。也就是說,REST服務中的API將不再以執行了什么動作為中心,而是以資源為中心。一些對資源的通用操作有添加,取得,修改,刪除,以及對符合特定條件的資源進行列表操作。

      仍然讓我們以上面所舉的“將商品放入購物車”這個操作為例。在一個REST系統中,購物車將被抽象為一個資源,而“將商品放入購物車”這個操作將被解釋為對購物車這個資源的更新:更新購物車,以使特定商品包含在購物車內。

      可能對于剛剛學習REST的各位讀者而言,這種以資源為中心的描述方法有些別扭。這種描述方法的確有別于很多Web服務那樣以動作為中心。而與之對應的則是系統設計步驟的改變:我們將不再首先是別完成業務邏輯所需的各動作,而是支持業務邏輯所需要的各資源。那么我們應該如何抽象出這些資源呢?首先,我們對某個操作不要再關注它所執行的動作,而是關心它所操作的賓語。通常情況下,該賓語就會是REST系統中的資源。

      在這里,我們就以“提交訂單”作為示例來展示如何抽象資源。

      首先,在“提交訂單”這個動作中,訂單是賓語。因此對于該業務邏輯,其將作為一個資源存在。除此之外,在訂單中還需要包含一系列信息,例如訂單中所包含的商品,訂單所屬人等。一旦這些都可以被該REST系統中的其它資源使用,那么它們也將成為獨立的資源。

      但是有時候,一個動作可能并不存在著它所操作的賓語。在這種情況下,我們就需要考慮該動作產生或消除了哪個實體,或者哪個實體的狀態發生了變化。這個發生了變化的實體實際上就是一種資源。例如對于登陸這一行為,其實際上在服務端創建了一個會話實例。該會話實例中則包含了登陸IP,登陸時間,以及登陸時所用的憑證等。再比如對于用戶更改密碼這種行為,其所操作的資源就是用戶資料。

      在抽象資源的過程中,我們需要按照自頂向下的方式,即首先辨識出系統中的最主要資源,然后再辨識這些主要資源的子資源,并依次進行迭代。

      對主資源的抽取主要通過分析業務邏輯來完成。在得到功能需求以后,我們首先要分析這些業務邏輯所操作的賓語。這些賓語可能有兩種情況:主資源或者其它資源的子資源。主資源實際上就是能夠獨立存在的一系列資源。而子資源則需要依附于主資源之上才能表達實際的意義。同時各個子資源也可能擁有自身的子資源。

      判斷一個資源是否是子資源的一個方法就是看它是否能獨立地表示其具體含義。例如對于一個egoods上所銷售的商品,其名稱,價格,簡介等屬性可以清晰地描述該商品到底是什么,到底如何銷售。因此這些商品實際上是一個主資源。但是每種商品所支持的郵遞服務需要是一個子資源:一個商品可以支持多種郵遞服務。這些郵遞服務根據派送距離等需要不同的價格,也提供了不同的郵遞速度。由于這些郵遞服務與商家和郵遞服務公司所達成的服務價格有關,并且會由于商品重量的變化而變化,因此這些郵遞服務并不能為其它商家所提供的郵遞服務作為參考,因此其應該作為該商品的一個子資源。

      或者也可以說,如果一個資源是主資源,那么其可以被不同的資源實例包含引用而不會產生歧義。而如果一個資源是子資源,那么被不同的資源實例引用可能會產生歧義。

      但是需要注意的是,一種資源可能有多種不同的表現形式。例如對于在使用列表展示各個商品的時候,egoods只需要展示商品的名稱,一個對該商品的簡單描述,商品的價格以及一張商品的照片。而在用戶打開了該商品頁之后,頁面則需要顯示更詳盡的信息,如商品的重量,商品所在地等等。

      除此之外,資源列表也有可能擁有多種不同的表現形式。舉例來說,如果egoods上屬于某個分類的商品太多,需要分頁顯示,那么這種分頁是否也應該是一種資源?答案是,這些分頁并不是一種資源,而其只是資源列表的一種表現方式。在每頁所包含商品數量,排序規則等條件發生變化的時候,該資源列表中所包含的各個商品也會發生變化。

      那么如何判斷我們為REST服務所定義的資源是否合理呢?一般情況下,我都使用下面的一些判斷方法:

      首先,我們需要考慮對該資源的CRUD是否有意義,從而驗證資源的定義是否合理。就以剛剛說到的列表的分頁顯示為例,我們可以想象一下如何對分頁進行添加和刪除?一旦刪除了該分頁,那么屬于該分頁中的各個商品也應該被刪除么?而且刪除了分頁X的數據后,原本X + 1分頁的數據將展示在X分頁中。很顯然,將商品的分頁定義為資源并不合理。

      其次,我們需要檢查資源是否需要除CRUD之外的動詞來操作。該方法用來檢查資源中是否還有子資源沒有被抽象。如果該資源還需要額外的動詞,那么我們就需要考慮這些操作到底引起了什么樣的狀態變化,進而抽象出該資源的子資源。

      除此之外,我們還需要檢查這些資源是否是被整體使用,創建和刪除。該方法用來探測是否一個子資源應該是一個主資源。如果在刪除一個資源的時候,其子資源還可以被其它資源重用,那么該子資源實際上具有較高的重用性,應該是一個主資源。

    ?

    資源的URL設計

      在前面已經提到過,統一接口約束中的第一條子約束就是每個資源都擁有一個資源標識。在正確地辨識出了一個資源之后,我們就需要為這些資源分配其所對應的URI。一個資源所對應的URI可能有多種表示方式,如到底是用單數還是復數表示資源等。因此在一個基于HTTP的REST系統中,如何組織針對各個資源的URL實際上是最重要的一部分。畢竟一個明確的,有意義并且穩定的API接口實際上是對服務對用戶的一種承諾。

      在HTTP中,一個URL主要由以下幾個部分組成:

  • 協議。即HTTP以及HTTPS。
  • 主機名和端口。如www.egoods.com:8421
  • 資源的相對路徑。如/api/categories。
  • 請求參數。即由問號開始的由鍵值對組成的字符串:?page=1&page_size=20
  •   在為一個資源設計其所對應的URL時,我們需要著重考慮第三部分和第四部分組成。

    通過URL來表示資源

      在辨識出了REST系統中的各個資源以后,我們就需要開始為這些資源設計各自所對應的URL了。

      首先要介紹的是,所有的資源都應該存在于一個相對路徑之下。請讀者回憶之前我們介紹的通過向/api發送一個GET請求得到所有可以被訪問的資源這個示例:

    GET /api Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/jsonHTTP/1.1 200 OK Content-Type: application/json Content-Length: xxx{"version": "1.0","resources": [{"label" : "Categories","description" : "Product categories","uri": "/api/categories"}, {"label" : "Items","description" : "All items on sell","uri": "/api/items"}] }

      因此對于從向該相對路徑發送請求才能得到的各個主資源來說,將它們置于相對路徑/api之下是非常合理的。

      除了這個原因之外,API的版本更迭也是一個考慮。假如軟件開發人員需要開發一個新版本的REST API,那么他可能就需要重新抽象并定義系統中的各個資源。但是如果兩個版本的API中都擁有一個categories資源,并且系統為了保持后向兼容性同時保留了兩個版本的API,那么將只有一個資源可以使用/categories這個相對路徑。也正因為如此,將這些資源置于相對路徑/api之下,并在第二個版本的API出現之后將新的資源抽象置于/api-v2下是一種較為流行的做法。

      在明確了所有的資源都應該置于/api這樣一個相對路徑下之后,我們就來講解如何為資源定義對應的URL。一個最簡單的情況是:指定主資源所對應的URL。由于主資源是一類獨立的資源,因此它應該直接置于/api下。例如egoods網站中的產品分類就是一個主資源,我們會為其分配如下URL:

    /api/categories

      而對于其它主資源,如egoods網站中的產品,我們也會為其賦予一個具有類似結構的URL:

    /api/items

      這樣,每類主資源都將擁有一個特定于該類資源的URL。這些URL就對應著相應資源實例的集合。

      如果需要表示某個主資源類型中的特定實例,那么我們就需要在該類主資源所對應的URL之后添加該實例的ID。如egoods網站中的食品分類的ID為1,那么其所對應的URL就將是:

    /api/categories/1

      一個較為特殊的情況則是,對于某種類型的主資源,整個系統將有且僅有一個該類型資源的實例。那么該資源將不再需要通過ID來訪問。我能想到的一個例子就是對整個系統進行介紹的資源。該資源實例所對應的URL將是:

    /api/about

      而一個資源實例中還可能擁有子資源。這些子資源與資源實例之間的關系主要有兩種情況:資源實例包含了一個子資源的集合,以及資源實例僅僅可以包含一個子資源。對于資源實例包含了一個子資源集合的情況,我們需要將該子資源集合的URL置于該資源的相對路徑下。例如對于egoods上所銷售的ID為23456的商品所提供的郵遞服務,我們將使用如下的URL:

    /api/items/23456/shipments

      在該URI中,/api/items/23456對應的就是商品本身,而該商品所提供的郵遞服務則是該商品的子資源。與主資源特定實例所具有的URI類似,其中一個ID為87256的郵遞服務所對應的URI則為:

    /api/items/23456/shipments/87256

      如果資源實例僅僅可以包含一個子資源,那么對該子資源的訪問也將不再需要ID。如當前商品的折扣信息:

    /api/items/23456/discount

    單數?vs. 復數

      接下來要考慮的一點是,資源在URL中需要由單數表示還是復數表示?這在stackoverflow等眾多論壇上已經成為了一個經久不衰的話題。我們知道,在一個基于HTTP的REST系統中,一個資源所對應的URL實際上也就是對其進行操作的URL。因此適當地使用單數和復數對于該系統的用戶而言有一定的指示作用。在stackoverflow上的一個常見觀點是:如果一個URL所對應的資源是使用復數表示的,那么該類型的資源可能有多個。對該URL發送Get請求可能返回該資源的一個列表。反之,如果一個URL所對應的資源是使用單數表示的,那么該類型的資源將只有一個,因此對該URL發送Get請求將只返回該資源的一個實例。

      以egoods中的商品分類為例。由于一個網站所售賣的商品可能有多種類別,因此其需要在URL中使用復數形式:/api/categories。而對于一個該網站的用戶而言,由于其只會有一個個人偏好設置,因此其URL則需要使用單數形式:/api/users/{user_id}/preference。

      你可能會問:如果需要得到具有特定ID的某個實例時,我們應該對該資源使用單數還是復數呢?答案是復數。這是因為在通過特定ID訪問某個資源的實例實際上就是從該資源的集合中取出特定實例。因此表示該資源集合的URL實際上仍然需要使用復數形式,而其后所使用的ID則標明了其所訪問的是資源中的單一實例,因此向這個URL發送Get請求將返回該資源的單一實例。

      就以“食品”分類為例。該分類所對應的URL為/api/categories/1。該URL中的前半部分/api/categories表示egoods網站中所有分類的集合,而1則表示在該分類集合中的ID為1的分類。

    ?

    相對路徑 vs. 請求參數

      另一個經常導致疑惑的地方就是針對資源的某一種特征,我們到底是將其定義為URL中相對路徑的一部分還是作為請求參數。

      請考慮下面一個例子。在egoods網站中,我們售賣的手機主要有蘋果,三星等品牌。那么在為這些手機設計URL的時候,我們是否需要按照品牌對這些手機進行細分,從而用戶只要通過向/api/mobiles/brands/apple發送請求就能列出所有的蘋果手機?還是說,直接將手機的品牌置于請求參數中,從而通過/api/mobiles?brand=apple來列出所有的蘋果手機?

      在判斷到底是使用請求參數還是相對路徑時,我們一般分為下面幾步。

      首先,可選參數一般都應置于請求參數中。仍以egoods中的手機為例。在選擇手機時,用戶可以選擇品牌以及顏色。如果將品牌和顏色都定義在相對URL中,那么具有特定品牌和顏色的手機將可以通過兩個不同的URL訪問:/api/mobiles/brand/{brand}/color/{color}以及/api/mobiles/color/{color}/brand/{brand}。就用戶而言,其并無法了解這兩個URL所表示的是同一類資源還是不同類型的資源。當然,您可以說,我們只用/api/mobiles/brand/{brand}/color/{color}。但是該URL將無法處理用戶僅僅選擇了顏色,卻沒有選擇品牌的情況。

      其次,不是所有字符都可以在URL中被使用,如漢字,標點。為了處理這種情況,包含這些字符的篩選條件需要置于請求參數中。

      最后,如果該特征下包含子資源,那么它自身也就是一個資源,因此需要以相對路徑的方式展現它。例如在egoods網站中,每件商品所屬于的分類僅僅是它的一個特征。但是一個分類更包含了屬于它的各個品牌以及熱搜關鍵字等眾多信息。因此它其實是一個資源,需要在URI路徑中表示它。

      總的來說,既然使用HTTP來構建REST系統,那么我們就需要遵守URL各組成中的含義:URL中的相對路徑將用來標示“What I want”,也既對應著資源;而請求參數則用來標示“How I want”,即查看資源的方式。

    ?

    使用合適的動詞

      在知道了如何為每種資源定義URI之后,我們來看看如何操作這些資源。

      首先,在一個資源的生命周期之內常常會發生一系列通用事件(CRUD)。一開始,一個資源并不存在。只有用戶或REST服務創建了該資源以后其才存在,也即是上面所列出的通用事件中的C,Create。在一個資源創建完畢以后,用戶可能會從服務端請求該資源的表示,也就是上面所列出的通用事件的R,Retrieve。在特定情況下,用戶可能決定要更新該資源,因此會使用上面的通用事件中的U,即Update來更新資源。而在資源不再需要的時候,用戶可能需要通過通用事件D,即Delete來刪除該資源。同時用戶有時也需要列出屬于特定類型資源的資源實例,即通過List操作來得到屬于特定類型的資源的列表。

      在前面的講解中我們已經提到過,在 REST 系統中的每個資源都有一個特定的 URI 與之對應。HTTP 協議提供了多種在 URI上操作的動詞,如 GET,PUT,POST以 及 DELETE 等。因此在一個基于 HTTP 的 REST 服務中,我們需要使用這些 HTTP 動詞來表示如何對這些資源進行 CRUD 操作。而在什么情況下到底使用哪個動詞則是由這些動詞本身在HTTP協議中的意義所決定的。

      這其中 GET 和 DELETE 兩個動詞的含義較為清晰:

    The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI.

    The DELETE method requests that the origin server delete the resource identified by the Request-URI.

    ?

      也就是說,在需要讀取某個資源的時候,我們向該資源所對應的 URI 發送一個 GET 請求即可。類似的,在需要刪除一個資源的時候,我們只需要向該資源所對應的 URI 發送一個 DELETE 請求即可。而在希望得到某類型資源的列表的時候,我們可以直接向該類型資源所對應的 URI 發送一個 GET 請求。

      而動詞 PUT 和 POST 則是較為容易混淆的兩個動詞。在 HTTP 規范中,POST 的定義如下所示:

      The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line

    ?

      也就是說,POST 動詞會在目標 URI 之下創建一個新的子資源。例如在向服務端發送下面的請求時,REST 系統將創建一個新的分類:

    POST /api/categories Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json{"label" : "Electronics",…… }

    ? ? ?而PUT的定義則更為晦澀一些:

    The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI."

      也就是說,PUT則是根據請求創建或修改特定位置的資源。此時向服務端發送的請求的目標URI需要包含所處理資源的ID:

    POST /api/categories/8fa866a1-735a-4a56-b69c-d7e79896015e Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json{"label" : "Electronics",…… }

      可以看到,兩者都有創建的含義,但是意義卻不同。在決定到底是使用PUT還是POST來創建資源的時候,軟件開發人員需要考慮一系列問題:

      首先就是資源的ID是如何生成的。如果希望客戶端在創建資源的時候顯式地指定該資源的ID,那么就需要使用PUT。而在由服務端為該資源自動賦予ID的時候,我們就需要在創建資源時使用POST。在決定使用PUT創建資源的時候,防止資源URI與其它資源所具有的URI重復的任務需要由客戶端來保證。在這種情況下,客戶端常常使用GUID/UUID作為將資源的ID。但是到底使用GUID/UUID還是由服務端來生成ID不僅僅和REST有關,更會對數據庫性能等多個方面產生影響。因此在決定使用它們之前要仔細地考慮清楚。

      同時需要注意的是,因為REST要求客戶只可以通過服務端返回結果中所包含的信息來得到下一步操作所需要的信息,因此客戶端僅僅可以決定資源的ID,而URI中的其它部分則需要從之前得到的響應中取得。

      但是軟件開發人員常常會進入另外一個誤區很多人認為REST服務中的HATEOAS只能通過Hyperlink完成。實際上在Roy對REST的定義中使用的是Hypermedia,即響應中的所有多媒體信息。就像Roy在其個人網站上所說(http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven):

    A REST API must not define fixed resource names or hierarchies (an obvious coupling of client and server). Servers must have the freedom to control their own namespace. Instead, allow servers to instruct clients on how to construct appropriate URIs, such as is done in HTML forms and URI templates, by defining those instructions within media types and link relations.

      另外一個需要考慮的因素則是PUT的等冪性是否對REST系統的設計有所幫助。由于在同一個URI上調用兩次PUT所得到的結果相同。因此用戶在沒有接到PUT請求響應時可以放心地重復發送該響應。這在網絡丟包較為嚴重時是一個非常好的功能。反過來,在同一個URI上調用兩次POST將可能創建兩個獨立的子資源。

      除此之外,還需要考慮是否將資源的創建和更新歸結為一個API可以簡化用戶對REST服務的使用。用戶可以通過PUT動詞來同時完成創建和更新一個資源這兩種不同的任務。這樣的好處在于簡化了REST服務所提供的接口,但是反過來也讓一個API執行了兩種不同的任務,在一定程度上違反了API設計時每個API都需要有明確的意義這一原則。

      因此在決定到底使用POST還是PUT來完成資源的創建之前,請考慮上面所列出的三條問題,以確定到底哪個動詞更加適合。

      除此之外,另外一對類似的動詞則是PUT和PATCH。兩者之間的不同則在于PUT是對整個資源的更新,而PATCH則是對部分資源的更新。而該動詞的局限性則在于對該動詞的支持程度。畢竟在某些類庫中并沒有提供原生的對PATCH動詞的支持。

    使用標準的狀態碼

      在與 REST 服務進行交互的時候,用戶需要通過服務所返回的信息決定其所發送的請求是否被適當地處理。這部分功能是由REST 服務實現時所使用的協議所決定的,與 REST 架構無關。而在基于 HTTP 的 REST 服務中,該功能就由 HTTP 響應的狀態碼(Status Code)來完成。因此在設計一個 REST 服務時,我們需要額外地注意是否返回了正確的狀態碼。

      但是這些預定義的 HTTP 狀態碼并不能滿足所有的情況。有時候一個 REST 服務所希望返回的錯誤信息能夠更加精確地描述問題,例如在用戶重設密碼時,我們需要在用戶所輸入原密碼與系統中所記錄的密碼不匹配時返回“您所輸入的密碼有誤”這樣的消息。在 HTTP 協議中,我們并沒有辦法找到一個能夠精確地表示該意義的狀態碼。

      因此在通常情況下,REST服務都會在響應中額外地提供一個說明性的負載來告知用戶到底產生了什么問題。例如對于上面的重設密碼失敗的情況,服務端可能會返回如下響應:

    HTTP/1.1 400 Bad Request Content-Type: application/json Content-Length: xxx{"error_id" : "100045","header" : "Reset password failed","description" : "The original password is not correct" }

      上面的示例響應中主要包含以下的說明性信息:

  • 服務端響應的狀態碼。頁面邏輯可以通過判斷該狀態碼是否是4XX或5XX來判斷是否請求出錯,從而在頁面中展示一個警告對話框。
  • 服務所提供的內部錯誤ID。通常情況下,該內部錯誤ID也需要在警告對話框中展示出來。從而允許軟件用戶根據內部錯誤ID來獲取支持服務。
  • 錯誤的標題及簡述。通過該錯誤的標題及簡述,軟件用戶能夠了解系統內部到底發生了什么,并在是用戶輸入錯誤的時候允許用戶自行修改錯誤并重新發送正確的請求。
  •   在該錯誤中,最關鍵的當屬服務端的響應代碼。一個響應代碼不僅僅標示了請求是否成功,更有用戶該如何操作的含義。例如對于 401 Unauthorized 響應代碼而言,其表示該響應沒有提供一個合法的身份憑證,因此需要用戶首先執行登陸操作以得到一個合法的身份憑證,然后該資源可能就可以被訪問了。而 403 Forbidde n響應代碼則表示當前請求已經提供了一個合法的身份憑證,但是該身份憑證并沒有訪問該資源的權限,因此使用該身份憑證登陸重新登陸系統等操作并不能解決問題。

      因此在返回錯誤信息之前,軟件開發人員首先需要考慮清楚在響應中到底應該使用什么樣的響應代碼。而正確地選擇響應代碼則建立在軟件開發人員對這些響應代碼擁有一個正確的理解的前提下。

      當然,要將所有的響應代碼完全理解也需要大量的工作,而且 REST 服務的用戶也可能并沒有那么多的領域知識來了解所有的響應代碼的含義。因此在很多基于 HTTP 的 REST 系統中,系統在標示錯誤時只使用一系列常用的響應代碼,如 400,401,403,404,405,500,503 等。在用戶請求被處理時,系統將返回 200 OK ,表示請求已經被處理。而在處理時發生錯誤時則盡量使用這些響應代碼來表示。如果一個錯誤較為復雜,那么直接返回 400 或 500 ,并在響應的負載中提供具體的錯誤信息。

      不得不說的是,這種做法有時顯得簡單粗暴,尤其是對于一個開放平臺而言則更是致命的。當一個第三方廠商為一個開放平臺開發一個應用軟件,卻每次只能得到一個 400 錯誤,那么其內部應用邏輯將無法判斷到底是哪里出了問題。為了能讓用戶知道這里產生了錯誤,該第三方軟件只能將開放平臺所給出的信息直接顯示給用戶。但是這些信息實際上是建立在開放平臺這個語境下的,因此對于第三方廠商的用戶而言,這些信息晦澀難懂,甚至可能一點幫助也沒有。

      也就是說,到底如何組織這些響應代碼需要用戶根據所編寫的項目決定,尤其是該產品的使用者來決定。在定義一個平臺時,盡量使用更多的HTTP響應代碼,因為用戶極有可能通過該平臺編寫自己的第三方軟件。而在為一個普通的產品定義 REST API 時,將響應代碼定得非常專業可能反而導致易用性的下降。

      另外一點需要說明的是,個人不建議使用Wikipedia查找各個狀態碼的含義,而應該使用RFC所描述的各狀態碼的定義。 IANA提供了一張各個狀態碼所對應的RFC協議的列表,從而可以很容易地找到各個狀態碼所對應的RFC協議以及其所在的章節。該列表的地址為:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

      之所以不建議使用Wikipedia的原因主要有兩點:

  • 描述不夠詳細。在RFC定義中,每個狀態碼都對應著一段或多段文字,并且解釋非常清晰。而在Wikipedia中,每個狀態碼常常只有一句話。
  • 不夠準確。在Wikipedia的Reference節中,我們可以看到一系列特定平臺所定義的狀態碼,如Spring Framework所定義的420 Method Failure等。這非常具有誤導性。
  • 選擇適當的表示結構

      接下來我們要講解的就是如何為資源定義一個恰當的表示。

      首先需要強調的是,REST并沒有規定其服務中需要使用什么格式來表示資源。表示資源時所可以選取的表示形式實際上是由實現REST所使用的協議決定的。而在一個基于HTTP的REST服務中,我們可以使用JSON,也可以使用XML,甚至是自定義的MIME類型來表示資源。這些表現形式常常是等效的。相信讀者已經看到,本系列文章會使用JSON來表示這些資源。

      一個REST服務常常會同時支持多種客戶端。這些客戶端可能會使用不同的協議來與服務進行溝通。而且就算是使用相同的協議,不同的客戶端所可以接受的負載表示形式也會有所不同。因此客戶端需要與REST服務協商在通訊過程中所使用的負載。

      客戶端和服務端對所使用負載類型的協商通常都按照協議所規定的標準協商過程來完成。例如對于一個基于HTTP的REST服務,我們就需要使用Accept頭來標示客戶端所可以接受的負載類型:

    GET /api/categories Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/json

      而在服務端支持的情況下,返回的響應就將使用該MIME類型組織其負載:

    HTTP/1.1 200 OK Content-Type: application/json Content-Length: xxx

      在這里我們再重復一次:REST是一種組織Web服務的架構,其只在架構方面提出了一系列約束。可以說,所有對REST的講解都已經在前兩個章節,即“REST的定義”以及“資源識別”中完成了。而有關客戶端和服務端如何進行溝通,為資源定義什么樣的URI,使用什么格式的數據進行溝通等討論都是在闡述如何將REST架構所提出的各種約束和基于HTTP協議的Web服務結合在一起。畢竟在通常情況下,實現一個單純的技術不難,但是如何將多種技術規范自然地混合在一起,構成一個自然的,成熟穩定的解決方案才是項目開發中的難點。HTTP協議并不是為REST架構所定義的,因此如何用HTTP協議來恰當地描述一個REST服務才是本文所著重介紹的。

    ?

    負載的自描述性

      在前面對REST提出的幾個約束的講解中我們已經提到過,REST系統中所傳遞的各個消息的負載需要提供足夠的用于操作該資源的信息,如如何對資源進行添加,刪除以及修改等操作,并可以根據負載中所包含的對其它各資源的引用來訪問各個資源。這也對負載的自描述性提出了更高的要求。

      首先讓我們回頭看看egoods電子商務網站對食品分類的描述:

    {"uri" : "/api/categories/1","label" : "Food","items_url" : "/api/items?category=1","brands" : [{"label" : "友臣","brand_key" : "32073","url" : "/api/brands/32073"}, {"label" : "樂事","brand_key" : "56632","url" : "/api/brands/56632"}...],"hot_searches" : … }

      我想讀者在看到該響應之后可能就已經明白了很多域的含義。但還是讓我們依次對這些域進行講解。

      第一個要講解的是url域。該域用來標示該資源所對應的URL。可能您會問:既然我們就是從這個URL返回的該資源,那么為什么我們還需要在該資源中保存一個它所對應的URL呢?首先這是因為在統一接口約束中要求每個資源都擁有一個資源標識。在這里我們使用URL作為標識。而另一些基于HTTP的REST系統中,用來作為資源標識的常常是該資源的ID。個人更傾向于使用URL的原因則是:在某些情況下,如對某個資源定時刷新以進行監控的時候,URL可以直接被使用。

      接下來是label域。其用來記錄用于展示給用戶的分類名。

      items_url域則用來表示取得屬于該分類物品列表的URL。注意這里我使用了后綴_url以明確標明其是一個URL,需要通過跳轉來取得實際的數據。

      下一個域brands則用來表示屬于該分類的著名商品品牌。這里我們使用了一個數組,而數組中的每個元素都表示了一個品牌。每個品牌的表示都包含了一個展示給用戶的label,在搜索時所使用的鍵,以及該品牌所對應的url。您可能會懷疑為什么我們僅僅提供了這么少的域。這是因為他們僅僅是對這個品牌的引用,而并非是把該資源的詳細信息都包含進來了的緣故。在用戶希望查看該品牌的詳細信息的時候,他需要向該品牌引用中所標明的品牌的URL發送一個GET請求。

      而由于hot_searches域的組成及使用基本上與brands域類似,因此這里不再贅述。

      在大致地了解了食品分類的JSON表示中各個域的含義后,我們就將開始講解如何自行定義資源的JSON表示。對于一個簡單的,不包含任何子資源以及對其它資源的引用的資源,我們只需要通過一個包含簡單屬性的JSON來表示它。例如對于一個品牌,我們可能僅僅提供了一系列描述性信息:品牌的名稱,以及對品牌的簡單描述。那么它所對應的JSON表示可以表示為:

    {"uri" : "/api/brands/32059","label" : "Dole","description" : "An American-based agricultural multinational corporation." }

      而在另一個資源中,可能包含了對其它資源的引用。在這種情況下,我們就需要在表示對其它資源進行引用的域中通過URL來標明被引用資源的位置。例如一件Dole果汁中,可能就需要包含對品牌Dole的引用:

    {"uri" : "/api/items/1438299","label" : "Dole Grape Juice","price" : "$3.99","brand" : {"label" : "Dole""uri" : "/api/brands/32059"}…… }

    ?

      在上面的Dole果汁的表示中,我們可以看到它的brand域就是對品牌的引用。該引用中包含了該品牌的品牌名稱以及一個指向該品牌的URL。

      在一個基于HTTP的REST系統中,我們常常在資源的引用中包含一定量的描述信息。這主要因為兩點:

  • 提高性能。在一個對資源的引用中添加了用于顯示的屬性后,客戶端頁面可以避免再次通過url發送請求得到資源的具體描述,以得到用于顯示的信息。
  • 自描述性的要求。如果一個資源中包含了一個對其它資源進行引用的數組,那么用戶就需要通過該標簽來決定到底訪問哪個被引用的資源。
  •   當然,如果需要在展示Dole果汁的頁面中需要Dole這個品牌的完整信息,我們也可以將它直接嵌到Dole果汁的表示中:

    {"uri" : "/api/items/1438299","label" : "Dole Grape Juice","price" : "$3.99","brand" : {"uri" : "/api/brands/32059","label" : "Dole","description" : "An American-based agricultural multinational corporation."}…… }

      當然,如果一個資源的表示太過復雜,而且有些屬性實際上是相互關聯的,那么我們也可以通過一個屬性將它們歸結在一起:

    {"uri" : "/api/items/1438299","label" : "Dole Grape Juice","price" : "$3.99","brand" : {"uri" : "/api/brands/32059","label" : "Dole","description" : "An American-based agricultural multinational corporation."}"nutrient component" : {"sugar" : "14.5","protein" : "0.3","fat" : "0.1"}…… }

      在上面的Dole果汁的表示中,我們使用域nutrient component來表示所有的營養成分,而該域內部的各個子域則用來表示一系列相關的營養成分所占比例。

      另外,在不同的情況下,我們還可能對同一個資源提供不同的表現形式。例如在一個資源極為復雜,其JSON表示甚至可以達到幾百K的時候,我們可以為該資源提供一個簡化版本,以在非必要的情況下減少傳輸的數據量。

      例如在egoods中,我們會將某些物美價廉的商品置于它的首頁上,以吸引用戶購買。在用戶將鼠標移動到某個商品上并停留一段時間時,我們會為用戶展示一個Tooltip,并在該Tooltip中展示該商品的一部分信息。在這種情況下,向服務端請求該商品的所有信息以展示Tooltip便顯得有些效率低下了。

      有時候,一個資源可能并不支持特定用戶執行某個操作。例如一個管理員所創建的資源可能對普通用戶只讀。在這種情況下,我們需要禁止普通用戶對該資源的修改和刪除。為了能明確地告知用戶他所具有的權限,我們需要一個能顯式地標示用戶可以在一個資源上所執行操作的組成。在REST響應中,這種組成被稱為Hypermedia Controls。例如對于一個普通用戶,其從egoods中所返回的分類列表將如下所示:

    HTTP/1.1 200 OK Content-Type: application/json Content-Length: xxx[{"label" : "Food","uri" : "/api/categories/1","actions" : ["GET"]}, {"label" : "Clothes","uri" : "/api/categories/2","actions" : ["GET"]}...{"label" : "Electronics","uri" : "/api/categories/25","actions" : ["GET"]} ]

      可以看到,在上面的分類列表中,我們通過actions域顯式地標示了用戶可以在各個類別上所能執行的操作。而對于管理員,其還可以執行修改,刪除等操作:

    HTTP/1.1 200 OK Content-Type: application/json Content-Length: xxx[{"label" : "Food","uri" : "/api/categories/1","actions" : ["GET", "PUT", "DELETE"]}, {"label" : "Clothes","uri" : "/api/categories/2","actions" : ["GET", "PUT", "DELETE"]}...{"label" : "Electronics","uri" : "/api/categories/25","actions" : ["GET", "PUT", "DELETE"]} ]

    ?

      而在一系列較為著名的REST系統中,如Sun Cloud API,其更是通過Hypermedia Controls定義了除CRUD之外的動詞。如對于一個虛擬機,其在運行狀態下可以執行停止命令,而在停止狀態下可以執行啟動命令:

    {"vms" : [{"id" : "1",......"status" : "stopped","links" : [{"rel" : "start","method" : "post","uri" : "vms/1?op=start"}]}, {"id" : "2",......"status" : "started","links" : [{"rel" : "stop","method" : "post","uri" : "vms/2?op=stop"}]}] }

      但是一個常見的觀點是:如果一個資源需要除CRUD之外的額外的動詞,那么這種需求常常表示我們對于某個資源的定義并不是十分合理。因此在遇到這種情況時,軟件開發人員首先需要考慮為資源添加額外的動詞是否合適。

    ?

    無狀態約束

      在Roy Fielding的論文中,其為REST添加了一個無狀態約束:

    We next add a constraint to the client-server interaction: communication must be stateless in nature … such that each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client.

      從上面的陳述中可以看到,在一個REST系統中,用戶的狀態會隨著請求在客戶端和服務端之間來回傳遞。這也便是REST這個縮寫中ST(State Transfer)的來歷。

      為REST系統添加這個約束有什么好處呢?主要還是基于集群擴展性的考慮。如果REST服務中記錄了用戶相關的狀態,那么在集群中,這些用戶相關的狀態就需要及時地在集群中的各個服務器之間同步。對用戶狀態的同步將會是一個非常棘手的問題:當一個用戶的相關狀態在一個服務器上發生了更改,那么在什么時候,什么情況下對這些狀態進行同步?如果該狀態同步是同步進行的,那么同時刷新多個服務器上的用戶狀態將導致對用戶請求的處理變得異常緩慢。如果該同步是異步的,那么用戶在發送下一個請求時,其它服務器將可能由于用戶狀態不同步的原因無法正確地處理用戶的請求。除此之外,如果集群進行了不停機的橫向擴展,那么用戶狀態的同步需要如何完成?這些實際上都是非常難以處理的問題。

      但是現有的很多較為流行的技術及規范實際上都沒有限制用戶的請求是無狀態的。相信您知道,一個技術或規范實際上都擁有一個生態圈。在該生態圈之內的各技術之間可以較好地契合在一起。尤其是,有些技術實際上就會以該生態圈中的核心技術或規范所建立的假設之上來實現自己的功能。如果希望禁止該假設,那么讓某些技術工作起來就是非常困難的事情了。

      就以搭建基于HTTP的REST服務為例。在HTTP中,一個重要的功能就是Cookie和Session的使用(RFC6265)。該功能會在服務器里保留一個狀態。因此在一個基于HTTP的REST系統中,我們常常需要避免使用這些在服務器里面保留狀態的技術。但是某些技術,如用戶的登陸,實際上常常需要在服務器中添加一個狀態。

      所以在stackoverflow中,我們常常會看到有人問:我現在使用了這樣一種解決方案。這樣實現是不是RESTful?此時一些人就會說,這不是RESTful。但是pure RESTful和almost RESTful之間的區別主要還是在于一個是理論,一個是工程。在工程中,輕微地違反了一個準則并不一定代表這個解決方案一無是處。而是要看遵守該準則和輕微地違反了該準則之后工作量的大小以及后期的維護成本:之所以提出一系列準則,那是因為遵守該準則擁有一定的好處。如果對該準則的輕微違反可以減少大量的工作量,而且遵守準則的好處并沒有消失,或者是通過另一樣技術可以快速地重新獲得該好處,那么對準則的輕微違反是值得的。

    ?

    Authentication

      其實在上一節中,我們已經提出了無狀態約束給REST實現帶來的麻煩:用戶的狀態是需要全部保存在客戶端的。當用戶需要執行某個操作的時候,其需要將所有的執行該請求所需要的信息添加到請求中。該請求將可能被REST服務集群中的任意服務器處理,而不需要擔心該服務器中是否存有用戶相關的狀態。

      但是在現有的各種基于HTTP的Web服務中,我們常常使用會話來管理用戶狀態,至少是用戶的登陸狀態。因此,REST系統的無狀態約束實際上并不是一個對傳統用戶登錄功能友好的約束:在傳統登陸過程中,其本身就是通過用戶所提供的用戶名和密碼等在服務端創建一個用戶的登陸狀態,而REST的無狀態約束為了橫向擴展性卻不想要這種狀態。而這也就是為基于HTTP的REST服務添加身份驗證功能的困難之處。

      為了解決該問題,最為經典也最符合REST規范的實現是在每次發送請求的時候都將用戶的用戶名和密碼都發送給服務器。而服務器將根據請求中的用戶名和密碼調用登陸服務,以從該服務中得到用戶所對應的Identity和其所具有的權限。接下來,在REST服務中根據用戶的權限來訪問資源。

      這里有一個問題就是登陸的性能。隨著系統當前的加密算法越來越復雜,登陸已經不再是一個輕量級的操作。因此用戶所發送的每次請求都要求一次登陸對于整個系統而言就是一個巨大的瓶頸。

      在當前,解決該問題的方法主要是一個獨立的緩存系統,如整個集群唯一的登陸服務器。但是緩存系統本身所存儲的仍然是用戶的登陸狀態。因此該解決方案將仍然輕微地違反了REST的無狀態約束。

      還有一個類似的方法是通過添加一個代理來完成的。該代理會完成用戶的登陸并獲得該用戶所擁有的權限。接下來,該代理會將與狀態有關的信息從請求中刪除,并添加用戶的權限信息。在經過了這種處理之后,這些請求就可以轉發到其后的各個服務器上了。轉發目的地所在的服務器則會假設所有傳入的請求都是合法的并直接對這些請求進行處理。

      可以看到,無論是一個獨立的登陸服務器還是為整個集群添加一個代理,系統中都將有一個地方保留了用戶的登陸狀態。這實際上和在集群中對會話集中進行管理并沒有什么不同。也就是說,我們所嘗試的通過禁止使用會話來達成完全的無狀態并不現實。因此在一個基于HTTP的REST服務中,為登陸功能使用集中管理的會話是合理的。

      既然我們放松了對REST系統的無狀態約束,那么一個REST系統所可以使用的登陸機制將主要分為以下兩種:

      1.?? 基于HTTPS的Basic Access Authentication

    其好處是其易于實現,而且主流的瀏覽器都提供了對該功能的支持。但是由于登陸窗口都是由瀏覽器所提供的,因此其與產品外觀有很大不同。除此之外,瀏覽器都沒有提供登出的功能,也沒有提供找回密碼等功能。

      2.?? 基于Cookie及Session的管理

    在使用Cookie來管理用戶的注冊狀態的時候,其實際上就是將服務端所返回的Cookie在每次發送請求的時候添加到請求中。雖然說這個Cookie并非存儲了用戶應用的狀態,但是其實際存儲了用戶的登陸狀態。因此客戶端的角度來講,由服務端管理的Session并不符合REST所倡導的無狀態的要求。

      可以說,上面的兩種方法各有優劣。可能第二種方法從客戶端的角度看來并不是RESTful的,但是其優勢則在于很多類庫都直接提供了對該功能的支持,從而簡化了會話管理服務器的實現。

      在這里順便提一句,如果項目足夠大,將一些SSO產品集成到服務中也是不錯的選擇。

    ?

    版本管理

      在前面已經提到過,一個REST系統為資源所抽象出的URI實際上是對用戶的一種承諾。但反過來說,軟件開發人員也很難預知一個資源的各方面特征如何在未來發生變化,從而提供一個永遠不變的URI。

      在一個REST系統逐漸發展的過程中,新的屬性,新的資源將逐漸被添加到該系統中。在這些更改過程中,資源的URI,訪問資源的動詞,響應中的Status Code將不能發生變化。此時軟件開發人員所做的工作就是在現有系統上維護REST API的后向兼容性。

      當資源發生了過多的變化,原有的URI設計已經很難兼容現有資源應有的定義時,軟件開發人員就需要考慮是否應該提供一個新版本的REST API。那么我們該如何對資源的版本進行管理呢?

      首先要考慮的就是,新API的版本信息是否應當包含在資源的URI中。這在各著名論壇中仍然是一個爭議較大的話題。一種觀點認為在不同版本的API中,一個資源擁有不同的地址在一定程度上違反了HATEOAS:URI只是用來指定一個資源所在的位置,而不是該資源如何被抽象。如果一個資源由不同的URI標示其不同的表現形式,那么用戶將無法通過一個響應中所標示的URI得到其它URI所指向的表示形式。而且在URI中添加了有關版本的信息也就標示著其可能會隨著時間的推移發生變化。

      一種使用獨立URI的方法是基于Accept頭。在一個請求中,我們常常標明了Accept頭,以標示客戶端希望得到的表現形式。在該頭中,用戶可以添加所請求的資源的版本信息:

    GET /api/categories/1 Host: www.egoods.com Authorization: Basic xxxxxxxxxxxxxxxxxxx Accept: application/vnd.ambergarden.egoods-v3+json

      而在接收到該請求之后,服務端將返回該資源的第三個版本:

    HTTP/1.1 200 OK Content-Type: application/vnd.ambergarden.egoods-v3+json Content-Length: xxx{"uri" : "/api/categories/1","label" : "Food",…… }

      可以看到,該方法是非常嚴格地遵守REST系統所提出的約束的。但其也并不是沒有缺點:添加一個自定義MIME類型(Custom MIME Type)也是一個很麻煩的流程,而且在很多現有技術中都沒有很好地支持它,如HTML5中的Form。因此這種方案的缺點是對REST API用戶并不那么友好。

      除此之外,另一種基于重定向的解決方案也被提出。該方案允許一個REST系統提供多個版本的API,并在URI中標明版本號:

    /api/v2/categories /api/v1/categories

      這樣用戶可以選擇使用特定版本的REST API來實現客戶端功能。由于其使用固定版本的API,因此并不存在著一個資源有多種表示,進而違反了HATEOAS約束的問題。

      在REST系統的API隨時間逐漸發展出眾多版本的時候,系統對API的維護也將成為一個較大的問題。此時就需要逐漸退役一些年代久遠的API 版本。對這些版本的退役主要分為兩步:首先將其標為過期的,但是還在一段時間內支持。在這種情況下,對這些已經過期的API的訪問將得到3XX響應,如301 Moved Permanently,以通知用戶該URI所標示的資源需要使用新版本的URI進行訪問。而再經過一段時間后,則將過期的REST API標記為廢棄的。此時用戶在訪問這些URI時將返回4XX響應,如410 Gone。

      接下來,該REST系統還可以提供一個通用的REST API接口,并與最新版本的API保持一致:

    /api/categories

      這樣用戶還可以選擇一直使用最新版本的API,只是同時也需要一直對其進行維護,以保持與最新版本API的兼容性。在REST系統的API隨著時間的推移逐漸發生變化的時候,該客戶端也需要逐漸更新自身的功能。

      但是該方法有一個問題:由通用URI所辨識出的各個資源需要是穩定的,不能在一定時間之后被廢棄,否則會給用戶帶來非常大的維護性的麻煩。舉例來說,假設客戶端邏輯添加了一系列操作分類的功能。當REST系統決定不再采用分類作為商品歸類的標準,那么客戶端邏輯中與分類相關的各個功能都需要進行大幅度地修改。過于頻繁的這種改動很容易導致用戶對該系統所提供的API失去維護的信心。因此在抽象資源時一定要努力地將各個資源的邊界辨識清楚。雖然說這聽起來很嚇人,但是在經過仔細考慮后這種情況還是較為容易避免的。

      但是反過來說,理論常常與實際有些脫鉤,更何況REST是在2000年左右提出的,無法做到能夠預見到十余年后所使用的各項技術。因此在盡量符合REST所提出的各約束上提供一個最直觀的,具有最高易用性的API才是王道。無限制地提供后向兼容性是一個非常困難,成本非常高的事情。因此在版本管理這一方面上來說,我們也需要盡量兼顧項目需求和完全遵從理論這兩者之間的平衡。

      而在同一個版本之中,我們則需要保證API的后向兼容性。也就是說,在添加新的資源以及為資源添加新的屬性的時候,原有的對資源進行操作的API也應該是工作的。

      對于一個基于HTTP的REST服務而言,軟件開發人員需要遵守如下的守則以保持API的后向兼容性:

  • 不能在請求中添加新的必須的參數。
  • 不能更改操作資源的動詞。
  • 不能更改響應的HTTP status。
  •   而前向兼容性則顯得沒有那么重要了。REST服務的前向兼容性要求現有的服務兼容未來版本服務的客戶端。但是由于服務提供商所提供的服務常常是最新版本,因此對前向兼容性有要求的情況很少出現。另外一點是,為一個服務提供前向兼容性其實并不那么容易。因為這要求軟件開發人員對產品的未來方向進行非常多的假設,而且這些假設不能有錯誤。反過來,這種對服務的前向兼容性的要求主要由客戶端自身通過保持后向兼容性來完成。

    ?

    性能

      接下來我們就來簡單地說說基于HTTP的REST服務中的性能問題。在基于HTTP的REST服務中,性能提升主要分為兩個方面:REST架構本身在提高性能方面做出的努力,以及基于HTTP協議的優化。

      首先要討論的就是對登陸性能的優化。在前面我們已經介紹過,在一個基于HTTP的REST服務中,每次都將用戶的用戶名和密碼發送到服務端并由服務端驗證這些信息是否合法是一個非常消耗資源的流程。因此我們常常需要在登陸服務中使用一個緩存,或者是使用第三方單點登陸(SSO)類庫。

      除此之外,軟件開發人員還可以通過為同一個資源提供不同的表現形式來減少在網絡上傳輸的數據量,從而提高REST服務的性能。

      而在集群內部服務之間,我們則可以不再使用JSON,XML等這種用戶可以讀懂的負載格式,而是使用二進制格式。這樣可以大大地減少內部網絡所需要傳輸的數據量。這在內部網絡交換數據頻繁并且所傳輸的數據量巨大時較為有效。

      接下來就是REST系統的橫向擴展。在REST的無狀態約束的支持下,我們可以很容易地向REST系統中添加一個新的服務器。

      除了這些和REST架構本身相關的性能提升之外,我們還可以在如何更高效地使用HTTP協議上努力。一個最常見的方法就是使用條件請求(Conditional Request)。簡單地說,我們可以使用如下的HTTP頭來有條件地存取資源:

  • ETag:一個對用戶不透明的用來標示資源實例的哈希值
  • Data-Modified:資源被更改的時間
  • If-Modified-Since:根據資源的更改時間有條件地Get資源。這將允許客戶端對未更改的資源使用本地緩存。
  • If-None-Match:根據ETag的值有條件地Get資源。
  • If-Unmodified-Since:根據資源的更改時間有條件地Put或Delete資源。
  • If-Match:根據ETag的值有條件地Put或Delete資源。
  •   當然,這里所提到的一系列性能優化方案實際上僅僅是比較常見的,與基于HTTP的REST服務關聯較大的方案。只是顧慮到過多地陳述和REST關聯不大的話題一方面顯得比較沒有效率,另一方面也是因為通過寫另一個系列博客可以將問題陳述得更加清楚,因此在這里我們將不再繼續討論性能相關的話題。

    ?

    相關資源

    AtomPub:http://atomenabled.org/。其是最為廣泛討論的并借鑒的RESTful服務。其由眾多HTTP和REST專家所編寫,甚至包括Roy Fielding本人也參與于其中

    Roy Fielding的REST論文:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

    Roy Fielding的個人網站:http://roy.gbiv.com/untangled/。

    RFC列表:http://www.ietf.org/rfc/

    ?

    轉載請注明原文地址并標明轉載:http://www.cnblogs.com/loveis715/p/4669091.html

    商業轉載請事先與我聯系:silverfox715@sina.com

    總結

    以上是生活随笔為你收集整理的REST设计模式简介的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久激情内射婷内射蜜桃人妖 | 亚洲成a人片在线观看日本 | 久久久久久久久蜜桃 | 东京无码熟妇人妻av在线网址 | 久久精品国产精品国产精品污 | 国产精品-区区久久久狼 | 黑人粗大猛烈进出高潮视频 | 十八禁真人啪啪免费网站 | 亚洲爆乳大丰满无码专区 | 综合人妻久久一区二区精品 | 熟女少妇在线视频播放 | 国产成人精品无码播放 | 国产高潮视频在线观看 | 日韩av无码一区二区三区不卡 | 色婷婷综合中文久久一本 | 精品久久综合1区2区3区激情 | 亚洲国产高清在线观看视频 | 免费网站看v片在线18禁无码 | 中文字幕+乱码+中文字幕一区 | 无码人妻精品一区二区三区不卡 | 国产欧美熟妇另类久久久 | 青青久在线视频免费观看 | 激情综合激情五月俺也去 | 在线成人www免费观看视频 | 欧美刺激性大交 | 搡女人真爽免费视频大全 | 久久久久久亚洲精品a片成人 | 日本精品少妇一区二区三区 | 久久国产精品萌白酱免费 | 久久国产36精品色熟妇 | 亚洲国产精品一区二区第一页 | 永久免费观看国产裸体美女 | 色欲综合久久中文字幕网 | 综合网日日天干夜夜久久 | 国产精品丝袜黑色高跟鞋 | 一二三四在线观看免费视频 | 无码中文字幕色专区 | 久久国语露脸国产精品电影 | 亚洲成色www久久网站 | 亚洲色偷偷男人的天堂 | 丰满妇女强制高潮18xxxx | 国产成人精品无码播放 | 99麻豆久久久国产精品免费 | 中文字幕久久久久人妻 | 欧美精品一区二区精品久久 | 免费视频欧美无人区码 | 黄网在线观看免费网站 | 无码一区二区三区在线观看 | 成人免费视频视频在线观看 免费 | 久久国产36精品色熟妇 | 久久99精品国产.久久久久 | 国产香蕉97碰碰久久人人 | 国产精品va在线观看无码 | 欧美xxxx黑人又粗又长 | 伊人久久婷婷五月综合97色 | 天天综合网天天综合色 | 国产人妻精品一区二区三区 | 精品一区二区不卡无码av | 无码人妻黑人中文字幕 | 国产性生大片免费观看性 | 国产精品久久久久7777 | 2020最新国产自产精品 | 久久综合狠狠综合久久综合88 | 成在人线av无码免观看麻豆 | 国产精品亚洲一区二区三区喷水 | 乱人伦人妻中文字幕无码 | 亚洲理论电影在线观看 | 亚洲日韩中文字幕在线播放 | 无码人妻久久一区二区三区不卡 | 思思久久99热只有频精品66 | 久久99精品国产麻豆蜜芽 | 成人女人看片免费视频放人 | 欧美国产日韩亚洲中文 | 亚洲成a人片在线观看无码 | 久久久久国色av免费观看性色 | 蜜臀aⅴ国产精品久久久国产老师 | 熟女俱乐部五十路六十路av | 成人精品视频一区二区三区尤物 | 亚洲精品中文字幕久久久久 | 美女极度色诱视频国产 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国精品人妻无码一区二区三区蜜柚 | 色综合视频一区二区三区 | 东京无码熟妇人妻av在线网址 | 300部国产真实乱 | 亚洲 激情 小说 另类 欧美 | 国产偷国产偷精品高清尤物 | 99久久精品午夜一区二区 | 在线天堂新版最新版在线8 | 国产精品人妻一区二区三区四 | 国产精品嫩草久久久久 | 午夜嘿嘿嘿影院 | 西西人体www44rt大胆高清 | 欧美人与动性行为视频 | 亚洲一区二区三区香蕉 | 丰满人妻翻云覆雨呻吟视频 | 天天做天天爱天天爽综合网 | 欧洲熟妇色 欧美 | 欧美老妇交乱视频在线观看 | √8天堂资源地址中文在线 | 爽爽影院免费观看 | 亚洲国产综合无码一区 | 亚洲成av人在线观看网址 | 天堂а√在线地址中文在线 | 一本无码人妻在中文字幕免费 | 无码毛片视频一区二区本码 | 国产免费观看黄av片 | 永久免费观看美女裸体的网站 | 无遮无挡爽爽免费视频 | 国产精品怡红院永久免费 | 全黄性性激高免费视频 | 中文字幕无码日韩欧毛 | 精品夜夜澡人妻无码av蜜桃 | 久久久久亚洲精品中文字幕 | 国产精品久久久午夜夜伦鲁鲁 | 性色av无码免费一区二区三区 | 久久99久久99精品中文字幕 | 中文毛片无遮挡高清免费 | 麻豆蜜桃av蜜臀av色欲av | 丝袜足控一区二区三区 | 俄罗斯老熟妇色xxxx | 日韩欧美中文字幕在线三区 | 久久精品国产99精品亚洲 | 国产sm调教视频在线观看 | 国产亚洲精品久久久久久久久动漫 | 亚洲日韩一区二区三区 | 国产色xx群视频射精 | 成在人线av无码免观看麻豆 | 久久精品99久久香蕉国产色戒 | 国产精品鲁鲁鲁 | 亚洲人成网站在线播放942 | 成人欧美一区二区三区黑人免费 | 99久久婷婷国产综合精品青草免费 | 成人免费视频一区二区 | 人妻插b视频一区二区三区 | 国产精品无码一区二区三区不卡 | 伊在人天堂亚洲香蕉精品区 | 欧美精品免费观看二区 | 日本乱偷人妻中文字幕 | 国产精品亚洲一区二区三区喷水 | 水蜜桃亚洲一二三四在线 | 亚洲国产高清在线观看视频 | 国产小呦泬泬99精品 | 国产 浪潮av性色四虎 | 学生妹亚洲一区二区 | 欧美变态另类xxxx | 丰满妇女强制高潮18xxxx | 国产精品亚洲专区无码不卡 | 亚洲中文字幕久久无码 | 天天av天天av天天透 | 麻花豆传媒剧国产免费mv在线 | ass日本丰满熟妇pics | 无套内谢的新婚少妇国语播放 | 免费观看黄网站 | 扒开双腿吃奶呻吟做受视频 | 国产成人综合色在线观看网站 | 久久天天躁夜夜躁狠狠 | 狂野欧美性猛xxxx乱大交 | 人妻中文无码久热丝袜 | 中文字幕av伊人av无码av | 久久综合久久自在自线精品自 | 日韩精品无码免费一区二区三区 | 国精产品一区二区三区 | 亚洲国产av美女网站 | 六月丁香婷婷色狠狠久久 | 国产成人精品久久亚洲高清不卡 | 色综合久久88色综合天天 | 成人av无码一区二区三区 | 午夜熟女插插xx免费视频 | 伊人久久婷婷五月综合97色 | 久久精品国产一区二区三区肥胖 | 无码人妻丰满熟妇区五十路百度 | 国产黄在线观看免费观看不卡 | 丰满人妻精品国产99aⅴ | 啦啦啦www在线观看免费视频 | 亚洲最大成人网站 | 国产亲子乱弄免费视频 | 永久免费观看国产裸体美女 | 精品少妇爆乳无码av无码专区 | 国产尤物精品视频 | 欧美兽交xxxx×视频 | 国产xxx69麻豆国语对白 | 无码精品人妻一区二区三区av | 欧美阿v高清资源不卡在线播放 | 免费无码肉片在线观看 | 妺妺窝人体色www在线小说 | 精品久久综合1区2区3区激情 | 亚洲毛片av日韩av无码 | 熟女少妇在线视频播放 | 中文精品无码中文字幕无码专区 | a在线观看免费网站大全 | 中文字幕人妻丝袜二区 | 秋霞特色aa大片 | 婷婷色婷婷开心五月四房播播 | 香蕉久久久久久av成人 | 久久久久久久女国产乱让韩 | 欧美日韩人成综合在线播放 | 少女韩国电视剧在线观看完整 | 国产农村乱对白刺激视频 | 欧美一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 粗大的内捧猛烈进出视频 | 国产一区二区三区日韩精品 | 久久久久免费看成人影片 | 麻豆成人精品国产免费 | 99久久99久久免费精品蜜桃 | 小泽玛莉亚一区二区视频在线 | 亚洲乱亚洲乱妇50p | 精品一区二区不卡无码av | 欧美精品免费观看二区 | 狠狠躁日日躁夜夜躁2020 | 国产偷抇久久精品a片69 | 十八禁真人啪啪免费网站 | 亚洲中文字幕无码中文字在线 | 人人妻人人澡人人爽欧美一区 | 天天综合网天天综合色 | 欧美freesex黑人又粗又大 | 午夜男女很黄的视频 | 国产精品人人爽人人做我的可爱 | 女人色极品影院 | 99精品无人区乱码1区2区3区 | 日本精品人妻无码免费大全 | 国产香蕉尹人视频在线 | 一二三四社区在线中文视频 | 99精品视频在线观看免费 | 国产电影无码午夜在线播放 | 东京一本一道一二三区 | а√资源新版在线天堂 | 国产精品久久久久9999小说 | 日韩欧美中文字幕公布 | 爱做久久久久久 | 午夜福利电影 | 成人免费视频视频在线观看 免费 | 午夜性刺激在线视频免费 | 丰满人妻精品国产99aⅴ | 九月婷婷人人澡人人添人人爽 | 久久精品国产99久久6动漫 | 欧美精品一区二区精品久久 | 亚洲伊人久久精品影院 | 精品国产一区二区三区四区在线看 | 丰满少妇熟乱xxxxx视频 | 日产国产精品亚洲系列 | 永久免费观看美女裸体的网站 | 天天摸天天碰天天添 | 全黄性性激高免费视频 | 一区二区三区高清视频一 | 日韩欧美群交p片內射中文 | 久久亚洲中文字幕精品一区 | 国产av人人夜夜澡人人爽麻豆 | 国产又爽又黄又刺激的视频 | ass日本丰满熟妇pics | 奇米影视7777久久精品 | 久久久久成人精品免费播放动漫 | 无码精品国产va在线观看dvd | 久久精品一区二区三区四区 | 黑人大群体交免费视频 | 久久久久免费看成人影片 | 2020久久香蕉国产线看观看 | 一本大道伊人av久久综合 | 国产成人无码av在线影院 | 伊人久久大香线蕉亚洲 | 国内精品人妻无码久久久影院 | 久久亚洲日韩精品一区二区三区 | 日本护士毛茸茸高潮 | 日本www一道久久久免费榴莲 | 婷婷六月久久综合丁香 | 日本va欧美va欧美va精品 | 欧美喷潮久久久xxxxx | 性欧美牲交在线视频 | 国产香蕉97碰碰久久人人 | 老子影院午夜伦不卡 | 国产午夜福利亚洲第一 | 国产激情精品一区二区三区 | 国产69精品久久久久app下载 | 日韩人妻无码一区二区三区久久99 | 国产乱子伦视频在线播放 | 亚洲国产日韩a在线播放 | 98国产精品综合一区二区三区 | 亚洲成av人片天堂网无码】 | 人妻少妇精品久久 | 亚洲最大成人网站 | 国产激情艳情在线看视频 | 乱中年女人伦av三区 | 又大又硬又爽免费视频 | aⅴ在线视频男人的天堂 | 中国女人内谢69xxxx | 亚洲一区二区三区 | 清纯唯美经典一区二区 | 中文久久乱码一区二区 | 欧美日韩视频无码一区二区三 | 国产在线精品一区二区高清不卡 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品国产自线拍免费软件 | 国产综合色产在线精品 | www国产亚洲精品久久网站 | 人妻少妇精品久久 | 亚洲日韩av一区二区三区四区 | 小泽玛莉亚一区二区视频在线 | 丰满人妻翻云覆雨呻吟视频 | 欧美性生交xxxxx久久久 | 亚洲色欲久久久综合网东京热 | 久久国产精品二国产精品 | 国产亚洲视频中文字幕97精品 | 亚无码乱人伦一区二区 | 亚洲成av人影院在线观看 | 中文字幕人成乱码熟女app | 图片区 小说区 区 亚洲五月 | 水蜜桃亚洲一二三四在线 | 少妇厨房愉情理9仑片视频 | 97无码免费人妻超级碰碰夜夜 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲中文字幕在线观看 | 免费网站看v片在线18禁无码 | 亚洲 激情 小说 另类 欧美 | 最近中文2019字幕第二页 | 东京热一精品无码av | 欧美性生交活xxxxxdddd | 国产精品久久久 | 久久人妻内射无码一区三区 | 色婷婷久久一区二区三区麻豆 | 久久久精品成人免费观看 | 综合人妻久久一区二区精品 | 精品少妇爆乳无码av无码专区 | 美女张开腿让人桶 | 久久久久免费看成人影片 | 国产香蕉97碰碰久久人人 | 国产精品久久国产精品99 | 亚洲精品中文字幕乱码 | 亚洲熟妇色xxxxx欧美老妇 | 76少妇精品导航 | 久久99精品久久久久久 | 国产精品久久精品三级 | 亚洲aⅴ无码成人网站国产app | 内射巨臀欧美在线视频 | 欧美三级a做爰在线观看 | 欧美freesex黑人又粗又大 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕 人妻熟女 | 动漫av一区二区在线观看 | 精品aⅴ一区二区三区 | 在线观看免费人成视频 | 久久亚洲日韩精品一区二区三区 | 少妇一晚三次一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 少妇高潮喷潮久久久影院 | 在教室伦流澡到高潮hnp视频 | 在线观看国产午夜福利片 | 天天拍夜夜添久久精品大 | 女人和拘做爰正片视频 | 2020久久超碰国产精品最新 | 男女超爽视频免费播放 | 久久午夜无码鲁丝片 | 一本久道久久综合婷婷五月 | 伊人久久大香线蕉av一区二区 | 无码吃奶揉捏奶头高潮视频 | 成人无码精品1区2区3区免费看 | 1000部夫妻午夜免费 | 正在播放东北夫妻内射 | 欧美性生交活xxxxxdddd | 久久亚洲国产成人精品性色 | 波多野42部无码喷潮在线 | 亚洲国精产品一二二线 | 99在线 | 亚洲 | 国产人妻精品一区二区三区 | 性啪啪chinese东北女人 | 无码av免费一区二区三区试看 | 在线天堂新版最新版在线8 | 欧美 亚洲 国产 另类 | 亚洲日韩av一区二区三区中文 | 丰满人妻精品国产99aⅴ | 亚洲国产欧美日韩精品一区二区三区 | 亚洲理论电影在线观看 | 国内揄拍国内精品少妇国语 | 无码一区二区三区在线 | 欧美黑人乱大交 | 国产美女精品一区二区三区 | 天天综合网天天综合色 | 国产手机在线αⅴ片无码观看 | 国产sm调教视频在线观看 | 香蕉久久久久久av成人 | 国产猛烈高潮尖叫视频免费 | 国产片av国语在线观看 | 福利一区二区三区视频在线观看 | 老太婆性杂交欧美肥老太 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国产精品无码一区二区三区 | 美女扒开屁股让男人桶 | 亚洲成色在线综合网站 | 人人澡人人妻人人爽人人蜜桃 | 久久久中文字幕日本无吗 | 日韩精品成人一区二区三区 | 国产极品美女高潮无套在线观看 | 亚洲日韩精品欧美一区二区 | 人人妻人人澡人人爽人人精品浪潮 | 国产九九九九九九九a片 | 丝袜人妻一区二区三区 | 亚洲a无码综合a国产av中文 | 老太婆性杂交欧美肥老太 | 亚欧洲精品在线视频免费观看 | 欧美日韩人成综合在线播放 | 国产婷婷色一区二区三区在线 | 精品久久综合1区2区3区激情 | 无码纯肉视频在线观看 | 色五月五月丁香亚洲综合网 | 亚洲色在线无码国产精品不卡 | 国产sm调教视频在线观看 | 又大又硬又爽免费视频 | 性生交片免费无码看人 | 人妻体内射精一区二区三四 | 日韩精品无码一区二区中文字幕 | 国产特级毛片aaaaaa高潮流水 | 国产色xx群视频射精 | 亚洲一区二区三区无码久久 | 国产成人精品三级麻豆 | 亚洲国产成人a精品不卡在线 | 男女下面进入的视频免费午夜 | 亚洲欧洲中文日韩av乱码 | 亚洲色无码一区二区三区 | 亚洲国精产品一二二线 | 骚片av蜜桃精品一区 | 中国女人内谢69xxxxxa片 | 久久久久se色偷偷亚洲精品av | 大乳丰满人妻中文字幕日本 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品亚洲а∨无码播放麻豆 | 人妻夜夜爽天天爽三区 | 国产黑色丝袜在线播放 | 性欧美牲交xxxxx视频 | 大乳丰满人妻中文字幕日本 | 1000部夫妻午夜免费 | 又大又硬又爽免费视频 | 国色天香社区在线视频 | 夜精品a片一区二区三区无码白浆 | 亚洲成在人网站无码天堂 | 国产偷自视频区视频 | 精品水蜜桃久久久久久久 | 精品日本一区二区三区在线观看 | 亚洲天堂2017无码 | 久久综合狠狠综合久久综合88 | 国产精品香蕉在线观看 | 国产97人人超碰caoprom | 久久久久99精品成人片 | 夜夜高潮次次欢爽av女 | 久久99热只有频精品8 | 亚洲熟悉妇女xxx妇女av | 无码一区二区三区在线观看 | 亚洲欧洲日本综合aⅴ在线 | 亚洲色www成人永久网址 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美老妇与禽交 | 正在播放东北夫妻内射 | 天堂亚洲2017在线观看 | 欧美日韩亚洲国产精品 | 久久天天躁夜夜躁狠狠 | 免费无码肉片在线观看 | 人妻体内射精一区二区三四 | 久久zyz资源站无码中文动漫 | 国产无套粉嫩白浆在线 | 亚洲精品成a人在线观看 | 中文精品久久久久人妻不卡 | 色综合久久久久综合一本到桃花网 | 色婷婷香蕉在线一区二区 | 九一九色国产 | 日本肉体xxxx裸交 | 国产熟女一区二区三区四区五区 | 日本护士毛茸茸高潮 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产深夜福利视频在线 | 国产成人精品优优av | 男女下面进入的视频免费午夜 | 国产精品久久久久无码av色戒 | 亚洲精品成a人在线观看 | 嫩b人妻精品一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 噜噜噜亚洲色成人网站 | 国产欧美亚洲精品a | 国产办公室秘书无码精品99 | 天天做天天爱天天爽综合网 | 精品一区二区三区无码免费视频 | 国产手机在线αⅴ片无码观看 | 午夜成人1000部免费视频 | 乱码av麻豆丝袜熟女系列 | 麻豆精品国产精华精华液好用吗 | 欧美一区二区三区视频在线观看 | 超碰97人人做人人爱少妇 | 欧美精品国产综合久久 | 亚洲国产成人a精品不卡在线 | 中文字幕无码av激情不卡 | 日韩亚洲欧美精品综合 | 日本一区二区三区免费播放 | 熟妇女人妻丰满少妇中文字幕 | 精品无码一区二区三区的天堂 | 国产内射爽爽大片视频社区在线 | 久久精品国产亚洲精品 | 色综合久久中文娱乐网 | 无遮挡啪啪摇乳动态图 | 偷窥村妇洗澡毛毛多 | 免费看少妇作爱视频 | 午夜福利试看120秒体验区 | 亚洲中文字幕av在天堂 | 国产亚洲人成a在线v网站 | 久久婷婷五月综合色国产香蕉 | 色噜噜亚洲男人的天堂 | 色综合久久久久综合一本到桃花网 | 国产在线精品一区二区高清不卡 | 欧美成人免费全部网站 | 中文字幕无码人妻少妇免费 | 国产人妻精品午夜福利免费 | 国产成人无码av一区二区 | 曰本女人与公拘交酡免费视频 | 国产国产精品人在线视 | 中文字幕av伊人av无码av | 欧美亚洲国产一区二区三区 | 色一情一乱一伦一区二区三欧美 | 精品久久久久久亚洲精品 | 精品一区二区三区波多野结衣 | 亚洲成熟女人毛毛耸耸多 | 亚洲精品美女久久久久久久 | 成人一在线视频日韩国产 | 激情内射亚州一区二区三区爱妻 | 色综合久久久久综合一本到桃花网 | 未满小14洗澡无码视频网站 | 激情亚洲一区国产精品 | 欧美人与动性行为视频 | 高潮喷水的毛片 | 77777熟女视频在线观看 а天堂中文在线官网 | 97精品人妻一区二区三区香蕉 | 国产精品亚洲lv粉色 | 又黄又爽又色的视频 | 国产精品毛片一区二区 | 中文字幕乱码亚洲无线三区 | 麻豆蜜桃av蜜臀av色欲av | 国内精品久久久久久中文字幕 | 性生交大片免费看l | 丰满人妻被黑人猛烈进入 | 99国产欧美久久久精品 | 亚洲成a人片在线观看日本 | 99er热精品视频 | 国产精华av午夜在线观看 | 亚洲熟熟妇xxxx | av在线亚洲欧洲日产一区二区 | 又紧又大又爽精品一区二区 | 国产在线aaa片一区二区99 | a国产一区二区免费入口 | 免费观看的无遮挡av | 午夜福利不卡在线视频 | 又大又硬又黄的免费视频 | 国产精品美女久久久 | 亚欧洲精品在线视频免费观看 | 大肉大捧一进一出好爽视频 | 无人区乱码一区二区三区 | 伦伦影院午夜理论片 | 丝袜人妻一区二区三区 | 性生交大片免费看女人按摩摩 | 国产suv精品一区二区五 | 亚洲自偷自拍另类第1页 | 永久免费观看美女裸体的网站 | 成人毛片一区二区 | 国色天香社区在线视频 | 国产精品久久久av久久久 | 亚洲国产高清在线观看视频 | 无套内射视频囯产 | 欧美 日韩 人妻 高清 中文 | 欧美人与禽zoz0性伦交 | 成熟妇人a片免费看网站 | 久久精品人人做人人综合试看 | 欧美兽交xxxx×视频 | 中文字幕亚洲情99在线 | 国产亚洲欧美日韩亚洲中文色 | 国产成人精品优优av | 亚洲理论电影在线观看 | 亚洲国精产品一二二线 | 国产电影无码午夜在线播放 | 亚洲日韩中文字幕在线播放 | 思思久久99热只有频精品66 | 少妇一晚三次一区二区三区 | 熟妇人妻无码xxx视频 | 久久久久久亚洲精品a片成人 | 国产熟妇高潮叫床视频播放 | 国产va免费精品观看 | 欧美高清在线精品一区 | 日本护士毛茸茸高潮 | 亚洲欧美精品aaaaaa片 | 国产精品视频免费播放 | 国产xxx69麻豆国语对白 | 色一情一乱一伦 | 欧洲vodafone精品性 | 牲欲强的熟妇农村老妇女 | a片免费视频在线观看 | 欧洲美熟女乱又伦 | 国产成人无码午夜视频在线观看 | 国精品人妻无码一区二区三区蜜柚 | 99久久婷婷国产综合精品青草免费 | 久久97精品久久久久久久不卡 | 亚洲一区二区三区四区 | 福利一区二区三区视频在线观看 | 欧美一区二区三区视频在线观看 | 中文字幕人成乱码熟女app | 国产精品国产三级国产专播 | 日日碰狠狠丁香久燥 | 久久精品国产日本波多野结衣 | 亚洲熟妇色xxxxx欧美老妇 | 女人被男人躁得好爽免费视频 | 亚洲综合久久一区二区 | 强伦人妻一区二区三区视频18 | 最近免费中文字幕中文高清百度 | 伦伦影院午夜理论片 | 国产精品久久久久9999小说 | 正在播放东北夫妻内射 | 成人精品视频一区二区 | 国内精品久久久久久中文字幕 | 久久久www成人免费毛片 | 亚洲春色在线视频 | 欧洲欧美人成视频在线 | 日韩视频 中文字幕 视频一区 | 精品久久久中文字幕人妻 | 久久久久免费看成人影片 | 亚洲自偷自拍另类第1页 | 亚洲gv猛男gv无码男同 | 两性色午夜免费视频 | 熟妇女人妻丰满少妇中文字幕 | 亚洲自偷精品视频自拍 | 亚洲国产一区二区三区在线观看 | 久久久无码中文字幕久... | 波多野结衣高清一区二区三区 | 亚洲综合另类小说色区 | 97资源共享在线视频 | 在教室伦流澡到高潮hnp视频 | 男女超爽视频免费播放 | 无码人妻精品一区二区三区不卡 | 精品乱子伦一区二区三区 | 强奷人妻日本中文字幕 | 国产精品.xx视频.xxtv | 狂野欧美性猛xxxx乱大交 | 亚洲国产欧美在线成人 | 老司机亚洲精品影院无码 | 色一情一乱一伦 | 午夜免费福利小电影 | 国产精品无套呻吟在线 | 福利一区二区三区视频在线观看 | 四虎国产精品免费久久 | 日日夜夜撸啊撸 | 377p欧洲日本亚洲大胆 | 男人扒开女人内裤强吻桶进去 | 国产人妻精品午夜福利免费 | 欧美精品无码一区二区三区 | 亚洲一区二区三区国产精华液 | 成人免费视频视频在线观看 免费 | 国产精品高潮呻吟av久久4虎 | 无码午夜成人1000部免费视频 | 国产精品久久久av久久久 | 欧美三级不卡在线观看 | 亚洲小说春色综合另类 | 欧美人妻一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 国产av无码专区亚洲a∨毛片 | 玩弄中年熟妇正在播放 | 国内揄拍国内精品人妻 | 真人与拘做受免费视频一 | 久久久久成人精品免费播放动漫 | 人妻体内射精一区二区三四 | 久久精品中文闷骚内射 | 亚洲国产精品一区二区第一页 | 丝袜 中出 制服 人妻 美腿 | 亚洲熟妇色xxxxx欧美老妇 | 久久99精品国产麻豆蜜芽 | 欧美日韩久久久精品a片 | 香港三级日本三级妇三级 | 国产精品美女久久久网av | 欧美老妇交乱视频在线观看 | 国产精品无码一区二区桃花视频 | 真人与拘做受免费视频一 | 亚洲综合久久一区二区 | 丁香花在线影院观看在线播放 | 麻豆av传媒蜜桃天美传媒 | 丰满岳乱妇在线观看中字无码 | 国产真人无遮挡作爱免费视频 | 久久天天躁夜夜躁狠狠 | 国产激情一区二区三区 | 99精品无人区乱码1区2区3区 | 纯爱无遮挡h肉动漫在线播放 | 欧美日韩一区二区三区自拍 | 亚洲精品无码人妻无码 | 国产激情综合五月久久 | 永久免费观看国产裸体美女 | 亚洲精品一区二区三区婷婷月 | 国产精品人人爽人人做我的可爱 | 色偷偷人人澡人人爽人人模 | 俺去俺来也www色官网 | 日本大香伊一区二区三区 | 日韩 欧美 动漫 国产 制服 | 久久国产精品_国产精品 | 久热国产vs视频在线观看 | 亚洲人成网站在线播放942 | av人摸人人人澡人人超碰下载 | 男人的天堂2018无码 | 性开放的女人aaa片 | 国产小呦泬泬99精品 | 无码一区二区三区在线 | 日本护士毛茸茸高潮 | 国产精品丝袜黑色高跟鞋 | 99精品无人区乱码1区2区3区 | 亚洲国产精品一区二区第一页 | 日本丰满熟妇videos | 扒开双腿吃奶呻吟做受视频 | 免费播放一区二区三区 | 色婷婷综合激情综在线播放 | 色婷婷av一区二区三区之红樱桃 | 亚洲一区av无码专区在线观看 | 国产免费久久久久久无码 | 熟女体下毛毛黑森林 | 亚洲综合久久一区二区 | 久久国产精品偷任你爽任你 | 无码人妻少妇伦在线电影 | 国内精品九九久久久精品 | 18禁黄网站男男禁片免费观看 | 国产成人精品一区二区在线小狼 | 欧美熟妇另类久久久久久多毛 | 精品aⅴ一区二区三区 | 日欧一片内射va在线影院 | 日韩av无码中文无码电影 | 国内少妇偷人精品视频免费 | 中文字幕无码免费久久99 | 中文字幕日韩精品一区二区三区 | 日本www一道久久久免费榴莲 | 97色伦图片97综合影院 | 久久久久亚洲精品男人的天堂 | 日本xxxx色视频在线观看免费 | 久久久精品人妻久久影视 | 久久国产精品_国产精品 | 亚洲精品午夜无码电影网 | 精品无码一区二区三区的天堂 | 鲁大师影院在线观看 | 人人妻人人澡人人爽欧美精品 | 蜜臀av在线播放 久久综合激激的五月天 | 国产三级精品三级男人的天堂 | 国产精品永久免费视频 | 亚洲一区二区三区 | av香港经典三级级 在线 | 久久成人a毛片免费观看网站 | 日韩人妻无码中文字幕视频 | 亚洲人成影院在线无码按摩店 | 亚洲精品一区二区三区在线观看 | 久久精品女人天堂av免费观看 | 少妇无码一区二区二三区 | 3d动漫精品啪啪一区二区中 | 欧美老妇交乱视频在线观看 | 久久综合九色综合97网 | 国产九九九九九九九a片 | 2020最新国产自产精品 | 国产精品无码永久免费888 | 亚洲成a人一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲成熟女人毛毛耸耸多 | 无码一区二区三区在线观看 | 成人aaa片一区国产精品 | 国内揄拍国内精品人妻 | 国产三级久久久精品麻豆三级 | 国产精品久久久久久无码 | 国色天香社区在线视频 | 欧美高清在线精品一区 | 国产精品a成v人在线播放 | 日韩人妻无码一区二区三区久久99 | 国产做国产爱免费视频 | 亚洲国产精华液网站w | 国产精品成人av在线观看 | 精品无码成人片一区二区98 | 熟妇人妻无乱码中文字幕 | 日本精品久久久久中文字幕 | 亚洲人成网站在线播放942 | 国产农村乱对白刺激视频 | 狂野欧美性猛交免费视频 | 一本精品99久久精品77 | 无码帝国www无码专区色综合 | 亚洲欧美精品aaaaaa片 | 亚洲成色在线综合网站 | 国产成人一区二区三区在线观看 | 中文字幕无码日韩欧毛 | 未满小14洗澡无码视频网站 | 国产激情艳情在线看视频 | 国产美女极度色诱视频www | 好爽又高潮了毛片免费下载 | 亚洲の无码国产の无码影院 | 丰满人妻精品国产99aⅴ | 欧美黑人乱大交 | 水蜜桃亚洲一二三四在线 | 激情内射日本一区二区三区 | 中文字幕av伊人av无码av | 亚洲熟妇色xxxxx欧美老妇 | 久激情内射婷内射蜜桃人妖 | 精品人妻中文字幕有码在线 | 无码国模国产在线观看 | 日韩欧美成人免费观看 | 天天躁日日躁狠狠躁免费麻豆 | 啦啦啦www在线观看免费视频 | 日韩人妻无码一区二区三区久久99 | 日本护士毛茸茸高潮 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 中文字幕无码人妻少妇免费 | 成人无码视频免费播放 | 人人妻人人澡人人爽人人精品浪潮 | 少妇愉情理伦片bd | 国产午夜福利亚洲第一 | 国产精品久久久久久久9999 | 国产色精品久久人妻 | 成人性做爰aaa片免费看 | 国产av无码专区亚洲a∨毛片 | 国产精品人人爽人人做我的可爱 | 宝宝好涨水快流出来免费视频 | 亚洲啪av永久无码精品放毛片 | 国语精品一区二区三区 | 又紧又大又爽精品一区二区 | 国产女主播喷水视频在线观看 | 大色综合色综合网站 | 国产精品久久久 | 日韩人妻少妇一区二区三区 | 两性色午夜免费视频 | 扒开双腿吃奶呻吟做受视频 | 亚洲综合久久一区二区 | 午夜肉伦伦影院 | 国产精品久久久久久久影院 | 伊人久久大香线蕉午夜 | 激情爆乳一区二区三区 | 初尝人妻少妇中文字幕 | 亚洲人成人无码网www国产 | 狠狠色噜噜狠狠狠7777奇米 | 性欧美疯狂xxxxbbbb | 在线亚洲高清揄拍自拍一品区 | 国产精品嫩草久久久久 | 久久亚洲精品中文字幕无男同 | 熟妇人妻无码xxx视频 | 成人片黄网站色大片免费观看 | 国产三级精品三级男人的天堂 | 日韩欧美群交p片內射中文 | 国产肉丝袜在线观看 | 国产真人无遮挡作爱免费视频 | 人人妻人人澡人人爽欧美精品 | 精品国产成人一区二区三区 | 中文久久乱码一区二区 | 两性色午夜视频免费播放 | 老司机亚洲精品影院无码 | 国产亚av手机在线观看 | 乌克兰少妇xxxx做受 | 中文字幕无码av激情不卡 | 久久精品丝袜高跟鞋 | 麻豆国产97在线 | 欧洲 | 亚洲中文字幕久久无码 | 澳门永久av免费网站 | 亚洲区欧美区综合区自拍区 | 婷婷色婷婷开心五月四房播播 | 99久久精品日本一区二区免费 | 亚洲一区二区三区含羞草 | 久久久www成人免费毛片 | 国产精品多人p群无码 | 国产激情精品一区二区三区 | 久久久中文久久久无码 | 国产成人无码区免费内射一片色欲 | 国产精品多人p群无码 | 免费网站看v片在线18禁无码 | 精品国产国产综合精品 | 亚洲日韩av一区二区三区中文 | 色欲人妻aaaaaaa无码 | 熟妇人妻无码xxx视频 | av无码电影一区二区三区 | 日韩无码专区 | 久久无码中文字幕免费影院蜜桃 | 亚洲中文字幕无码中字 | 日本va欧美va欧美va精品 | 桃花色综合影院 | 国产成人av免费观看 | 亚洲日韩av一区二区三区中文 | 亚洲gv猛男gv无码男同 | 国产在线无码精品电影网 | 人妻aⅴ无码一区二区三区 | 免费网站看v片在线18禁无码 | 丰满岳乱妇在线观看中字无码 | 亚洲一区二区三区香蕉 | 一区二区三区乱码在线 | 欧洲 | 精品国产av色一区二区深夜久久 | 中文字幕无码视频专区 | 99久久婷婷国产综合精品青草免费 | 99精品无人区乱码1区2区3区 | 大乳丰满人妻中文字幕日本 | 国产偷自视频区视频 | 国产绳艺sm调教室论坛 | 日本肉体xxxx裸交 | 国产精品久久精品三级 | 免费无码肉片在线观看 | 装睡被陌生人摸出水好爽 | 亚洲欧洲日本无在线码 | 少妇久久久久久人妻无码 | 精品国产一区二区三区四区在线看 | 精品久久久中文字幕人妻 | 欧美国产亚洲日韩在线二区 | 欧美精品无码一区二区三区 | 300部国产真实乱 | 国产精品无码一区二区三区不卡 | 国产精品内射视频免费 | 亚洲区小说区激情区图片区 | 国产婷婷色一区二区三区在线 | 爱做久久久久久 | 亚洲aⅴ无码成人网站国产app | 免费国产成人高清在线观看网站 | 六月丁香婷婷色狠狠久久 | 露脸叫床粗话东北少妇 | 精品国精品国产自在久国产87 | 国产激情无码一区二区app | 377p欧洲日本亚洲大胆 | 中文字幕无码热在线视频 | 成在人线av无码免观看麻豆 | 亚洲色偷偷男人的天堂 | 人妻aⅴ无码一区二区三区 | 男女性色大片免费网站 | 亚洲日韩av一区二区三区四区 | 乱人伦中文视频在线观看 | 天天做天天爱天天爽综合网 | 97精品人妻一区二区三区香蕉 | 国产乱人无码伦av在线a | 日本高清一区免费中文视频 | 国内精品九九久久久精品 | 久久久亚洲欧洲日产国码αv | 无码吃奶揉捏奶头高潮视频 | 最近中文2019字幕第二页 | 中文精品无码中文字幕无码专区 | 东京热男人av天堂 | 精品欧洲av无码一区二区三区 | 久久精品人人做人人综合 | 国产亚洲欧美在线专区 | 啦啦啦www在线观看免费视频 | 国产极品美女高潮无套在线观看 | 亚洲精品午夜无码电影网 | 在线a亚洲视频播放在线观看 | 无码av中文字幕免费放 | 亚洲狠狠色丁香婷婷综合 | 久久精品中文闷骚内射 | 无码人妻丰满熟妇区五十路百度 | 亚洲aⅴ无码成人网站国产app | av无码不卡在线观看免费 | 色狠狠av一区二区三区 | 中文字幕av伊人av无码av | 牲欲强的熟妇农村老妇女 | 亚洲码国产精品高潮在线 | 亚洲中文字幕成人无码 | 色婷婷综合激情综在线播放 | 久久久久久九九精品久 | 久热国产vs视频在线观看 | 久9re热视频这里只有精品 | 久久国产自偷自偷免费一区调 | 亚洲国产综合无码一区 | 日韩精品无码免费一区二区三区 | 丰满人妻精品国产99aⅴ | 国内精品九九久久久精品 | 亚洲成色www久久网站 | 欧美35页视频在线观看 | 高清不卡一区二区三区 | 无码人妻久久一区二区三区不卡 | 5858s亚洲色大成网站www | 天天躁日日躁狠狠躁免费麻豆 | 狠狠cao日日穞夜夜穞av | 国产乱人伦av在线无码 | 狂野欧美性猛xxxx乱大交 | 日本护士xxxxhd少妇 | 国产成人精品视频ⅴa片软件竹菊 | 捆绑白丝粉色jk震动捧喷白浆 | 免费视频欧美无人区码 | 亚洲 另类 在线 欧美 制服 | 国产乡下妇女做爰 | 欧美性色19p | 日韩成人一区二区三区在线观看 | 欧洲欧美人成视频在线 | 熟妇人妻无乱码中文字幕 | 国产xxx69麻豆国语对白 | 欧美乱妇无乱码大黄a片 | 精品一二三区久久aaa片 | 蜜桃臀无码内射一区二区三区 | 激情国产av做激情国产爱 | 国产精品-区区久久久狼 | 精品久久8x国产免费观看 | 欧美老妇交乱视频在线观看 | 久激情内射婷内射蜜桃人妖 | 久久久久久av无码免费看大片 | 在线成人www免费观看视频 | 熟女少妇在线视频播放 | 狂野欧美性猛xxxx乱大交 | 18禁黄网站男男禁片免费观看 | 午夜精品久久久久久久久 | 精品人妻人人做人人爽夜夜爽 | 亚洲а∨天堂久久精品2021 | av人摸人人人澡人人超碰下载 | 在线播放无码字幕亚洲 | 亚洲精品中文字幕久久久久 | 综合人妻久久一区二区精品 | 日本精品人妻无码免费大全 | 亚洲 激情 小说 另类 欧美 | 亚洲成色在线综合网站 | 久久久久久久人妻无码中文字幕爆 | 人妻aⅴ无码一区二区三区 | 亚洲精品成人av在线 | 国产高清av在线播放 | 亚洲日韩av一区二区三区四区 | 男人扒开女人内裤强吻桶进去 | 女人被男人爽到呻吟的视频 | 日本乱人伦片中文三区 | 少妇性l交大片欧洲热妇乱xxx | 国产免费久久精品国产传媒 | 国产午夜无码精品免费看 | 欧美人妻一区二区三区 | 熟女体下毛毛黑森林 | 精品无码一区二区三区爱欲 | 亚洲成av人影院在线观看 | 国产精品亚洲一区二区三区喷水 | 亚洲国产精品美女久久久久 | 欧美 丝袜 自拍 制服 另类 | 1000部啪啪未满十八勿入下载 | 久久综合激激的五月天 | 精品国产青草久久久久福利 | 3d动漫精品啪啪一区二区中 | 丝袜人妻一区二区三区 | 国产成人一区二区三区在线观看 | 成在人线av无码免观看麻豆 | 图片小说视频一区二区 | 无码精品国产va在线观看dvd | 老司机亚洲精品影院无码 | 亚洲国产精品无码久久久久高潮 | 荫蒂添的好舒服视频囗交 | 无码午夜成人1000部免费视频 | 亚洲欧美日韩国产精品一区二区 | 国产成人无码av在线影院 | 国产明星裸体无码xxxx视频 | 欧美黑人乱大交 | 蜜臀av无码人妻精品 | av在线亚洲欧洲日产一区二区 | 中文无码成人免费视频在线观看 | 成人精品天堂一区二区三区 | 激情爆乳一区二区三区 | 婷婷五月综合激情中文字幕 | 日日天干夜夜狠狠爱 | 极品尤物被啪到呻吟喷水 | 无码帝国www无码专区色综合 | 中国大陆精品视频xxxx | 国产超碰人人爽人人做人人添 | 风流少妇按摩来高潮 | 午夜精品一区二区三区在线观看 | 日本成熟视频免费视频 | 美女黄网站人色视频免费国产 | 国产口爆吞精在线视频 | 国产在线无码精品电影网 | 国产一区二区三区日韩精品 | √8天堂资源地址中文在线 | 色婷婷欧美在线播放内射 | 国产亚洲视频中文字幕97精品 | 国产亚洲视频中文字幕97精品 | 黑人粗大猛烈进出高潮视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲区小说区激情区图片区 | 粗大的内捧猛烈进出视频 | 男女爱爱好爽视频免费看 | 欧美日韩久久久精品a片 | 久久久中文字幕日本无吗 | 亚洲国产一区二区三区在线观看 | 亚洲一区二区三区含羞草 | 久久亚洲日韩精品一区二区三区 | 国产无套粉嫩白浆在线 | 亚洲精品国产第一综合99久久 | 久久亚洲精品中文字幕无男同 | 欧美日韩色另类综合 | 欧美精品无码一区二区三区 | 久久精品中文字幕一区 | 午夜精品久久久久久久久 | 国产网红无码精品视频 | 丰满少妇弄高潮了www | 国产精品国产自线拍免费软件 | 丰满少妇女裸体bbw | 99视频精品全部免费免费观看 | 在线看片无码永久免费视频 | 久久99久久99精品中文字幕 | 男人的天堂2018无码 | 无码乱肉视频免费大全合集 | 国产精品久久久久久无码 | 国产成人精品三级麻豆 | 日本精品人妻无码77777 天堂一区人妻无码 | 成人综合网亚洲伊人 | 中文字幕日产无线码一区 | 亚洲综合无码一区二区三区 | 国产成人无码区免费内射一片色欲 | 欧美性猛交xxxx富婆 | 成人亚洲精品久久久久软件 | 亚洲爆乳精品无码一区二区三区 | 人妻少妇精品视频专区 | 日本高清一区免费中文视频 | 欧美亚洲国产一区二区三区 | 人妻人人添人妻人人爱 | 亚洲精品成人av在线 | 亚洲成a人片在线观看日本 | 国产在线无码精品电影网 | 日本一区二区三区免费播放 | 国产艳妇av在线观看果冻传媒 | 伊在人天堂亚洲香蕉精品区 | 国产亚洲精品精品国产亚洲综合 | 免费无码午夜福利片69 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产精品第一区揄拍无码 | 四虎国产精品免费久久 | 国产成人无码a区在线观看视频app | 永久免费观看国产裸体美女 | 2019午夜福利不卡片在线 | 国产一精品一av一免费 | 午夜男女很黄的视频 | 永久免费观看美女裸体的网站 | 日本精品久久久久中文字幕 | 高潮毛片无遮挡高清免费视频 | 日本xxxx色视频在线观看免费 | 成人亚洲精品久久久久软件 | 国产美女极度色诱视频www | 欧美三级a做爰在线观看 | 麻豆md0077饥渴少妇 | 九九在线中文字幕无码 | 久久久久久久久蜜桃 | 中文字幕人妻丝袜二区 | 色老头在线一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 成人精品天堂一区二区三区 | 国内精品久久久久久中文字幕 | 日韩亚洲欧美中文高清在线 | 动漫av一区二区在线观看 | 76少妇精品导航 | 久久99精品国产.久久久久 | 日韩人妻无码一区二区三区久久99 | 精品久久久久香蕉网 | 精品一区二区三区无码免费视频 | 国产综合色产在线精品 | 人妻互换免费中文字幕 | 国产精品视频免费播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美人与物videos另类 | 日韩精品久久久肉伦网站 | 丝袜 中出 制服 人妻 美腿 | 性色欲网站人妻丰满中文久久不卡 | 国产人妻久久精品二区三区老狼 | 亚洲国产av精品一区二区蜜芽 | 男女性色大片免费网站 | 丰满少妇熟乱xxxxx视频 | 小sao货水好多真紧h无码视频 | 午夜熟女插插xx免费视频 | 一本大道久久东京热无码av | 国产无套内射久久久国产 | 亚洲精品综合一区二区三区在线 | 99久久人妻精品免费二区 | 亚洲色成人中文字幕网站 | 国产午夜福利100集发布 | 日本乱人伦片中文三区 | 中文字幕日韩精品一区二区三区 | 国产真人无遮挡作爱免费视频 | 麻豆国产人妻欲求不满谁演的 | 综合网日日天干夜夜久久 | 中文字幕人妻无码一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 少妇邻居内射在线 | 久久国语露脸国产精品电影 | 久久久久成人片免费观看蜜芽 | 国产精品人人妻人人爽 | 永久免费观看美女裸体的网站 | 97精品人妻一区二区三区香蕉 | 国产精品视频免费播放 | 男人的天堂av网站 | 夜夜影院未满十八勿进 | 日日噜噜噜噜夜夜爽亚洲精品 | 无码人妻出轨黑人中文字幕 | 日日干夜夜干 | 久久亚洲国产成人精品性色 | 无码毛片视频一区二区本码 | 荫蒂被男人添的好舒服爽免费视频 | 婷婷六月久久综合丁香 | 久久人人爽人人爽人人片av高清 | 亚洲中文字幕无码中字 | 久久天天躁狠狠躁夜夜免费观看 | 黑人粗大猛烈进出高潮视频 | 草草网站影院白丝内射 | 宝宝好涨水快流出来免费视频 | 一本久道久久综合婷婷五月 | 精品无码国产一区二区三区av | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲日本一区二区三区在线 | 久久精品丝袜高跟鞋 | 国产人成高清在线视频99最全资源 | 少妇被黑人到高潮喷出白浆 | 日本一区二区三区免费播放 | 欧美日韩视频无码一区二区三 | 野狼第一精品社区 | 久久久久99精品国产片 | 97精品国产97久久久久久免费 | 国产乱子伦视频在线播放 | 国产无遮挡又黄又爽又色 | 东京热一精品无码av | 精品无码国产一区二区三区av | 玩弄中年熟妇正在播放 | 丝袜 中出 制服 人妻 美腿 | 内射爽无广熟女亚洲 | 一本久久伊人热热精品中文字幕 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品无码国产 | 国色天香社区在线视频 | 国产成人精品视频ⅴa片软件竹菊 | 欧美成人午夜精品久久久 | 日日碰狠狠躁久久躁蜜桃 | 少妇性俱乐部纵欲狂欢电影 | 国产绳艺sm调教室论坛 | 欧美自拍另类欧美综合图片区 | 日本精品人妻无码免费大全 | 18禁黄网站男男禁片免费观看 | 人妻中文无码久热丝袜 | 一本久久伊人热热精品中文字幕 | 亚洲乱码国产乱码精品精 | 亚洲精品国偷拍自产在线麻豆 | 亚洲啪av永久无码精品放毛片 | 国产精品-区区久久久狼 | 无码成人精品区在线观看 | 2020最新国产自产精品 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲精品国产品国语在线观看 | 丰满人妻精品国产99aⅴ | 内射爽无广熟女亚洲 | 97夜夜澡人人双人人人喊 | 精品人妻中文字幕有码在线 | 欧美 日韩 人妻 高清 中文 | 精品乱码久久久久久久 | 亚洲の无码国产の无码步美 | 午夜男女很黄的视频 | 色综合久久久无码网中文 | 一本一道久久综合久久 | 国产熟女一区二区三区四区五区 | 亚洲人成网站免费播放 | 人妻少妇精品无码专区二区 | 亚洲国产精品一区二区美利坚 | 欧洲熟妇精品视频 | 午夜丰满少妇性开放视频 | 又大又硬又爽免费视频 | 国产精品.xx视频.xxtv | 曰本女人与公拘交酡免费视频 | 学生妹亚洲一区二区 | 一本色道久久综合亚洲精品不卡 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久99精品成人片 | 无码乱肉视频免费大全合集 | 国产极品视觉盛宴 | 精品国偷自产在线 | 日本成熟视频免费视频 | 亚洲国产成人a精品不卡在线 | 熟妇激情内射com | 夜夜高潮次次欢爽av女 | 巨爆乳无码视频在线观看 | 美女扒开屁股让男人桶 | 欧美午夜特黄aaaaaa片 | 麻豆av传媒蜜桃天美传媒 | 久久99精品久久久久久 | 国产精品久久久久9999小说 | 狠狠躁日日躁夜夜躁2020 | 无码任你躁久久久久久久 | 亚洲aⅴ无码成人网站国产app | 亚洲 a v无 码免 费 成 人 a v | 麻豆国产人妻欲求不满谁演的 | 亚洲日韩av一区二区三区中文 | 综合人妻久久一区二区精品 | 国产av一区二区精品久久凹凸 | 无遮挡国产高潮视频免费观看 | 麻豆精品国产精华精华液好用吗 | 四虎国产精品免费久久 | 无码人妻精品一区二区三区下载 | 岛国片人妻三上悠亚 | 国产成人精品三级麻豆 | 亚洲欧美国产精品专区久久 | 欧美精品在线观看 | 鲁大师影院在线观看 | 少妇性l交大片 | 久久久久久a亚洲欧洲av冫 | 亚洲国产精品无码一区二区三区 | 国产人妖乱国产精品人妖 | 又湿又紧又大又爽a视频国产 | 亚洲成av人片天堂网无码】 | 国产办公室秘书无码精品99 | 天天躁夜夜躁狠狠是什么心态 | 99麻豆久久久国产精品免费 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品一区三区三区在线观看 | 久久久久久久人妻无码中文字幕爆 | 一二三四在线观看免费视频 | 亚洲自偷自偷在线制服 | 成年女人永久免费看片 | 丰满人妻精品国产99aⅴ | 风流少妇按摩来高潮 | 亚洲国产精品一区二区第一页 | 久久综合网欧美色妞网 | 在线观看免费人成视频 | 国内丰满熟女出轨videos | 亚洲精品无码国产 | 久久国内精品自在自线 | 日日摸日日碰夜夜爽av | 久久久久国色av免费观看性色 | 亚洲色www成人永久网址 | 黑森林福利视频导航 | 88国产精品欧美一区二区三区 | 色婷婷久久一区二区三区麻豆 | 午夜福利不卡在线视频 | 欧美一区二区三区 | 欧美自拍另类欧美综合图片区 | 最新国产麻豆aⅴ精品无码 | 亚洲日本va中文字幕 | 国产午夜无码精品免费看 | 无码人妻丰满熟妇区毛片18 | 丰满妇女强制高潮18xxxx | 国内精品人妻无码久久久影院蜜桃 | 亚洲区小说区激情区图片区 | 精品国偷自产在线视频 | 日本一区二区三区免费高清 | 成人性做爰aaa片免费看 | 国产熟妇另类久久久久 | 久久综合九色综合97网 | 高潮喷水的毛片 | 亚洲国产欧美在线成人 | 精品国产一区二区三区四区在线看 | 性欧美大战久久久久久久 | 国产精品久久久午夜夜伦鲁鲁 | 鲁一鲁av2019在线 | 国产熟女一区二区三区四区五区 | 欧美丰满老熟妇xxxxx性 | 国产亚洲精品久久久ai换 | 亚洲欧美精品伊人久久 | 曰本女人与公拘交酡免费视频 | 久在线观看福利视频 | 精品人妻人人做人人爽 | 日韩欧美中文字幕在线三区 | 帮老师解开蕾丝奶罩吸乳网站 | 中文字幕无码免费久久9一区9 | 国产免费久久久久久无码 | 亚洲午夜无码久久 | 欧美人与动性行为视频 | 亚洲欧洲无卡二区视頻 | 妺妺窝人体色www在线小说 | 国产精品18久久久久久麻辣 | 中文无码成人免费视频在线观看 | 撕开奶罩揉吮奶头视频 | 欧美亚洲国产一区二区三区 | 76少妇精品导航 | 国产情侣作爱视频免费观看 | 图片区 小说区 区 亚洲五月 | 国产亚洲精品久久久ai换 | 99riav国产精品视频 | 东京无码熟妇人妻av在线网址 | √天堂资源地址中文在线 | 精品 日韩 国产 欧美 视频 | 国产精品久免费的黄网站 | 丰满岳乱妇在线观看中字无码 | 国产三级精品三级男人的天堂 | 色五月丁香五月综合五月 | 亚洲国产精品毛片av不卡在线 | 牲欲强的熟妇农村老妇女视频 | 国产亚洲欧美在线专区 | 精品久久久无码人妻字幂 | 久久伊人色av天堂九九小黄鸭 | 丰满少妇熟乱xxxxx视频 | 亚洲欧美综合区丁香五月小说 | 精品日本一区二区三区在线观看 | 丰满岳乱妇在线观看中字无码 | 精品欧美一区二区三区久久久 | 日韩无码专区 | 国产手机在线αⅴ片无码观看 | 精品夜夜澡人妻无码av蜜桃 | 国产办公室秘书无码精品99 | 国内揄拍国内精品少妇国语 | 国产精品自产拍在线观看 | aa片在线观看视频在线播放 | 国产精品久久久久久久影院 | 国产成人综合美国十次 | 国产精品嫩草久久久久 | 中文字幕无线码 | 国内精品久久毛片一区二区 | 色婷婷久久一区二区三区麻豆 | 国产亚洲日韩欧美另类第八页 | 成在人线av无码免观看麻豆 | 男女猛烈xx00免费视频试看 | 国产乡下妇女做爰 | 国产69精品久久久久app下载 | 最近中文2019字幕第二页 | 婷婷丁香六月激情综合啪 | 免费播放一区二区三区 | 国产人妻人伦精品1国产丝袜 | 麻豆国产人妻欲求不满 | 国产精品久久国产三级国 | 成人欧美一区二区三区黑人免费 | 国产综合久久久久鬼色 | 国产一区二区三区精品视频 | 精品久久综合1区2区3区激情 | 无码人妻丰满熟妇区五十路百度 | 99视频精品全部免费免费观看 | 免费看少妇作爱视频 | 在线天堂新版最新版在线8 | а√天堂www在线天堂小说 | 亚洲自偷自拍另类第1页 | 少妇的肉体aa片免费 | 久久人妻内射无码一区三区 | 高清无码午夜福利视频 | 国产一区二区三区影院 | 99久久婷婷国产综合精品青草免费 | 高潮喷水的毛片 | 毛片内射-百度 | 中文字幕人妻丝袜二区 | 国产农村乱对白刺激视频 | 精品成人av一区二区三区 | 久久精品国产精品国产精品污 | 日韩精品无码一区二区中文字幕 | 国产成人无码av一区二区 | 久久人人爽人人爽人人片ⅴ | 亚洲中文字幕乱码av波多ji | 高潮毛片无遮挡高清免费视频 | 东京热无码av男人的天堂 | 国产成人无码av一区二区 | 精品国偷自产在线视频 | 国产精品亚洲五月天高清 | 欧美性生交活xxxxxdddd | 伊人久久大香线蕉午夜 | 少女韩国电视剧在线观看完整 | 中文精品无码中文字幕无码专区 | 波多野结衣高清一区二区三区 | 国产猛烈高潮尖叫视频免费 | 国产精品对白交换视频 | 天天躁日日躁狠狠躁免费麻豆 | 一本精品99久久精品77 | 色欲av亚洲一区无码少妇 | 黑人玩弄人妻中文在线 | 久久久久se色偷偷亚洲精品av | 国产精品亚洲а∨无码播放麻豆 | 麻豆国产人妻欲求不满 | 熟妇人妻无乱码中文字幕 | 又紧又大又爽精品一区二区 | 国产又粗又硬又大爽黄老大爷视 | √8天堂资源地址中文在线 | 亚洲阿v天堂在线 | 亚洲狠狠色丁香婷婷综合 | 久久久婷婷五月亚洲97号色 | 狠狠色噜噜狠狠狠狠7777米奇 | 激情内射日本一区二区三区 | 中国女人内谢69xxxxxa片 | 老子影院午夜精品无码 | 亚洲精品久久久久久一区二区 | 中文字幕+乱码+中文字幕一区 | 亚洲爆乳无码专区 | 国产精品自产拍在线观看 | 日韩人妻无码中文字幕视频 | 国产成人无码午夜视频在线观看 | 成人无码视频免费播放 | 亚洲精品www久久久 | 国产午夜亚洲精品不卡下载 | 三级4级全黄60分钟 | 99精品无人区乱码1区2区3区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品成在人线av无码免费看 | 高清不卡一区二区三区 | 国産精品久久久久久久 | 5858s亚洲色大成网站www | 日韩欧美中文字幕在线三区 | 一本无码人妻在中文字幕免费 | 欧美三级a做爰在线观看 | 一本色道婷婷久久欧美 | 无码国产激情在线观看 | 国产精品亚洲lv粉色 | 亚洲伊人久久精品影院 | 亚洲日本一区二区三区在线 | 亚洲成色www久久网站 | 中文字幕av日韩精品一区二区 | 国产激情一区二区三区 | a片在线免费观看 | 内射巨臀欧美在线视频 | 日韩人妻少妇一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 福利一区二区三区视频在线观看 | 国内精品久久久久久中文字幕 | 精品久久久无码人妻字幂 | 亚洲男人av香蕉爽爽爽爽 | 国产精品多人p群无码 | 亚洲色欲色欲欲www在线 | 色综合久久网 | 中文字幕av伊人av无码av | 精品人妻中文字幕有码在线 | 久久久精品人妻久久影视 | 日韩av激情在线观看 | 亚洲精品鲁一鲁一区二区三区 | 亚洲成av人片在线观看无码不卡 | 男人的天堂av网站 | 一本无码人妻在中文字幕免费 | 国产亚洲欧美在线专区 | 精品无人国产偷自产在线 | 熟女少妇人妻中文字幕 | 日韩精品无码一区二区中文字幕 | 精品一区二区三区无码免费视频 | 亚洲精品一区三区三区在线观看 | 亚洲国产精品久久久久久 | 亚洲欧洲中文日韩av乱码 | 少妇无码一区二区二三区 | av无码电影一区二区三区 | 亚洲 另类 在线 欧美 制服 | 国产人成高清在线视频99最全资源 | 久久精品人人做人人综合 | 全球成人中文在线 | 精品偷拍一区二区三区在线看 | 无码纯肉视频在线观看 | 国产深夜福利视频在线 | 免费无码午夜福利片69 | 欧美 日韩 人妻 高清 中文 | 国产人妻精品一区二区三区 | 免费看男女做好爽好硬视频 | 无码人妻精品一区二区三区不卡 | 国产精品久久久久无码av色戒 | 97久久精品无码一区二区 | 网友自拍区视频精品 | 少妇人妻av毛片在线看 | 欧美精品国产综合久久 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 人妻人人添人妻人人爱 | 97久久精品无码一区二区 | 亚洲s色大片在线观看 | 亚洲熟妇色xxxxx亚洲 | 久久久成人毛片无码 | aⅴ在线视频男人的天堂 | 中文字幕人成乱码熟女app | 亚洲精品午夜国产va久久成人 | 亚洲一区二区三区香蕉 | 亚洲啪av永久无码精品放毛片 | 欧美熟妇另类久久久久久不卡 | 日韩欧美中文字幕在线三区 | 亚洲午夜无码久久 | 精品无码成人片一区二区98 | 久久人人爽人人爽人人片ⅴ | 午夜成人1000部免费视频 | 女人高潮内射99精品 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产无套内射久久久国产 | 亚洲男人av天堂午夜在 | 亚洲小说春色综合另类 | 久久久精品国产sm最大网站 | 老子影院午夜精品无码 | 5858s亚洲色大成网站www | 亚洲欧美日韩成人高清在线一区 | 免费人成网站视频在线观看 | 亲嘴扒胸摸屁股激烈网站 | 日本精品人妻无码免费大全 | 久久综合色之久久综合 | 欧美人与物videos另类 | 综合激情五月综合激情五月激情1 | 亚洲精品久久久久久久久久久 | 亚洲国产综合无码一区 | 正在播放东北夫妻内射 | 国产精品高潮呻吟av久久 | 国产亚洲精品久久久久久国模美 | 亚洲一区av无码专区在线观看 | 成人无码精品1区2区3区免费看 | 亚洲一区二区三区四区 | 日产精品99久久久久久 | 99久久婷婷国产综合精品青草免费 | 俺去俺来也在线www色官网 | 日本乱人伦片中文三区 | 一本大道久久东京热无码av | 国产女主播喷水视频在线观看 | 国产精品国产自线拍免费软件 | 欧美激情综合亚洲一二区 | 中文字幕 亚洲精品 第1页 | 欧美丰满老熟妇xxxxx性 | 日韩亚洲欧美中文高清在线 | 亚洲中文字幕无码一久久区 | 人妻熟女一区 | 老太婆性杂交欧美肥老太 | 狠狠噜狠狠狠狠丁香五月 | 亚洲日本在线电影 | 久久综合狠狠综合久久综合88 | 国产成人无码av一区二区 | 日本爽爽爽爽爽爽在线观看免 | 精品欧美一区二区三区久久久 | 国产真实伦对白全集 | 国产内射爽爽大片视频社区在线 | 夫妻免费无码v看片 | 日本精品久久久久中文字幕 | 久久99精品久久久久久动态图 | 日韩av无码一区二区三区 | 亚洲色欲久久久综合网东京热 | 日韩欧美中文字幕公布 | 国产无遮挡吃胸膜奶免费看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美成人午夜精品久久久 | 大地资源中文第3页 | 成人欧美一区二区三区黑人免费 | 鲁一鲁av2019在线 | 国产莉萝无码av在线播放 | 国产97人人超碰caoprom | 四十如虎的丰满熟妇啪啪 | 最新国产乱人伦偷精品免费网站 | 久久久精品国产sm最大网站 | 国产三级久久久精品麻豆三级 | 中文字幕乱码人妻无码久久 | 国精品人妻无码一区二区三区蜜柚 | 美女毛片一区二区三区四区 | 国产卡一卡二卡三 | 国产精品人人妻人人爽 | 激情爆乳一区二区三区 | 欧美熟妇另类久久久久久不卡 | 久久无码中文字幕免费影院蜜桃 | 国产又爽又黄又刺激的视频 | 人妻无码αv中文字幕久久琪琪布 | 精品无码国产一区二区三区av | 欧美午夜特黄aaaaaa片 | 黑人玩弄人妻中文在线 | 欧洲极品少妇 | 性欧美videos高清精品 | 色综合久久中文娱乐网 | 噜噜噜亚洲色成人网站 | 亚洲中文字幕无码中字 | 51国偷自产一区二区三区 | 一本色道久久综合亚洲精品不卡 | 欧美freesex黑人又粗又大 | a片免费视频在线观看 | 樱花草在线社区www | 3d动漫精品啪啪一区二区中 | 中文字幕乱妇无码av在线 | 国产激情无码一区二区 | 精品欧洲av无码一区二区三区 | 狂野欧美激情性xxxx | 色婷婷久久一区二区三区麻豆 | 亚洲精品国偷拍自产在线麻豆 | 中文无码成人免费视频在线观看 | 老熟女重囗味hdxx69 | 国产在线精品一区二区三区直播 | 精品国产一区二区三区四区在线看 | 久久久av男人的天堂 | 亚洲日韩av一区二区三区四区 | 成人一区二区免费视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 沈阳熟女露脸对白视频 | 丰满妇女强制高潮18xxxx | 久久99精品国产.久久久久 | 日欧一片内射va在线影院 | 乌克兰少妇xxxx做受 | 成年美女黄网站色大免费视频 | 偷窥日本少妇撒尿chinese | 欧美自拍另类欧美综合图片区 | 国产在线无码精品电影网 | 水蜜桃亚洲一二三四在线 | 日产精品99久久久久久 | 久久久国产一区二区三区 | 久久久久成人精品免费播放动漫 | 精品国产国产综合精品 | 国内少妇偷人精品视频 | 久久久久免费看成人影片 | 99久久久无码国产aaa精品 | 欧美日韩综合一区二区三区 | 久久久久99精品成人片 | 精品少妇爆乳无码av无码专区 | 俺去俺来也www色官网 | 国产精品第一区揄拍无码 | 久久久久亚洲精品男人的天堂 | 国产午夜无码视频在线观看 | 欧美猛少妇色xxxxx | 强伦人妻一区二区三区视频18 | www国产精品内射老师 | 国产精品久久久久9999小说 | 扒开双腿吃奶呻吟做受视频 | 女人被爽到呻吟gif动态图视看 | 国产熟妇高潮叫床视频播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 午夜精品久久久久久久 | 熟妇人妻激情偷爽文 | 亚洲精品中文字幕乱码 | 成 人 免费观看网站 | 7777奇米四色成人眼影 | 久久人妻内射无码一区三区 | 亚洲成a人片在线观看无码 | 国产69精品久久久久app下载 | 亚洲国产欧美国产综合一区 | 亚洲欧美日韩国产精品一区二区 |