3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > 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设计模式简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    久久久中文字幕日本无吗 | 色综合视频一区二区三区 | 76少妇精品导航 | 亚洲成av人在线观看网址 | 日日天干夜夜狠狠爱 | 婷婷六月久久综合丁香 | 亚洲爆乳精品无码一区二区三区 | 18无码粉嫩小泬无套在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产绳艺sm调教室论坛 | 成 人 网 站国产免费观看 | 国产无av码在线观看 | 欧洲vodafone精品性 | 国产成人综合在线女婷五月99播放 | 中文无码伦av中文字幕 | 国产在线aaa片一区二区99 | 丰满人妻精品国产99aⅴ | 在线天堂新版最新版在线8 | 国产精品亚洲一区二区三区喷水 | 黑人玩弄人妻中文在线 | 午夜精品久久久久久久 | 巨爆乳无码视频在线观看 | 久久久久久久女国产乱让韩 | 天堂在线观看www | 国产麻豆精品精东影业av网站 | 成人精品天堂一区二区三区 | 国精产品一品二品国精品69xx | 国产高清不卡无码视频 | 国产精品香蕉在线观看 | 97精品国产97久久久久久免费 | 18黄暴禁片在线观看 | 国产一区二区三区日韩精品 | 99久久99久久免费精品蜜桃 | 天海翼激烈高潮到腰振不止 | 中文字幕 亚洲精品 第1页 | 精品国产成人一区二区三区 | 久久久久免费精品国产 | 丰满少妇高潮惨叫视频 | 亚洲精品一区二区三区大桥未久 | 老太婆性杂交欧美肥老太 | 露脸叫床粗话东北少妇 | 午夜福利不卡在线视频 | 国产精品人妻一区二区三区四 | 精品夜夜澡人妻无码av蜜桃 | 美女黄网站人色视频免费国产 | 国产精品亚洲专区无码不卡 | 中文字幕无码视频专区 | 国产成人无码av一区二区 | 无码人妻丰满熟妇区毛片18 | 亚洲精品一区二区三区大桥未久 | 97久久超碰中文字幕 | 国产手机在线αⅴ片无码观看 | 国产精品亚洲五月天高清 | 午夜福利电影 | 久久久久免费看成人影片 | 国产精品国产自线拍免费软件 | 强开小婷嫩苞又嫩又紧视频 | 一本久道久久综合婷婷五月 | 人妻少妇精品无码专区二区 | 天干天干啦夜天干天2017 | 亚洲欧美综合区丁香五月小说 | 国产亚洲精品久久久久久 | 亚洲日本一区二区三区在线 | 青青青爽视频在线观看 | 国产情侣作爱视频免费观看 | 香蕉久久久久久av成人 | 亚洲色成人中文字幕网站 | 强伦人妻一区二区三区视频18 | 精品乱子伦一区二区三区 | 18无码粉嫩小泬无套在线观看 | 欧美亚洲日韩国产人成在线播放 | 亚洲精品一区二区三区四区五区 | 婷婷丁香五月天综合东京热 | 久久精品人妻少妇一区二区三区 | 精品成人av一区二区三区 | 亚洲 另类 在线 欧美 制服 | 亚洲熟悉妇女xxx妇女av | 欧美日韩亚洲国产精品 | 国产麻豆精品精东影业av网站 | 日本免费一区二区三区最新 | 久久www免费人成人片 | 一个人看的www免费视频在线观看 | 一本久道高清无码视频 | 精品人人妻人人澡人人爽人人 | 欧美精品一区二区精品久久 | 国产熟女一区二区三区四区五区 | 熟女体下毛毛黑森林 | 人妻与老人中文字幕 | 亚洲日韩av一区二区三区中文 | 欧美怡红院免费全部视频 | 亚洲男人av香蕉爽爽爽爽 | 日本www一道久久久免费榴莲 | 久久久中文久久久无码 | 亚洲精品成a人在线观看 | 久久久久se色偷偷亚洲精品av | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品一区三区三区在线观看 | 精品久久久无码中文字幕 | 亚洲精品国产精品乱码不卡 | 色五月丁香五月综合五月 | 亚洲国产高清在线观看视频 | 99精品国产综合久久久久五月天 | 国产精品理论片在线观看 | 色婷婷久久一区二区三区麻豆 | 欧美人妻一区二区三区 | 熟女体下毛毛黑森林 | 中文久久乱码一区二区 | 麻花豆传媒剧国产免费mv在线 | 精品久久久久久亚洲精品 | 国产亚洲欧美在线专区 | 亚洲精品综合五月久久小说 | 5858s亚洲色大成网站www | 欧美真人作爱免费视频 | 国产av人人夜夜澡人人爽麻豆 | 国产特级毛片aaaaaa高潮流水 | 日日干夜夜干 | 亚洲精品国产a久久久久久 | 久久99精品久久久久久动态图 | 久久国产精品_国产精品 | 丁香花在线影院观看在线播放 | 在线播放免费人成毛片乱码 | 国产av无码专区亚洲awww | 伊人久久婷婷五月综合97色 | 少妇高潮一区二区三区99 | 亚洲国产精品成人久久蜜臀 | 2020最新国产自产精品 | 免费无码肉片在线观看 | 四十如虎的丰满熟妇啪啪 | 国产av无码专区亚洲awww | 色五月丁香五月综合五月 | 又黄又爽又色的视频 | 久久久久av无码免费网 | 亚洲啪av永久无码精品放毛片 | 成 人 网 站国产免费观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 131美女爱做视频 | 国产成人综合在线女婷五月99播放 | 亚洲国产午夜精品理论片 | 动漫av一区二区在线观看 | 亚洲熟妇自偷自拍另类 | 亚洲欧美中文字幕5发布 | 国产人妻久久精品二区三区老狼 | 鲁大师影院在线观看 | 国产xxx69麻豆国语对白 | 曰韩无码二三区中文字幕 | 亚洲の无码国产の无码步美 | 久久人人爽人人爽人人片av高清 | 国产一区二区三区日韩精品 | 欧美xxxx黑人又粗又长 | 精品久久久中文字幕人妻 | 国产一区二区三区影院 | 亚洲欧美中文字幕5发布 | 亚洲乱亚洲乱妇50p | 色五月五月丁香亚洲综合网 | 中文字幕无码av波多野吉衣 | 亚洲一区二区三区国产精华液 | 少妇无码av无码专区在线观看 | 久久久精品人妻久久影视 | 久久久www成人免费毛片 | 久久99精品国产.久久久久 | 国产精品香蕉在线观看 | 久久久久av无码免费网 | 欧美一区二区三区 | 妺妺窝人体色www婷婷 | av香港经典三级级 在线 | 久久精品国产日本波多野结衣 | 中文字幕乱码亚洲无线三区 | 欧美国产日产一区二区 | 国产极品视觉盛宴 | 久久精品中文字幕大胸 | 人人妻人人澡人人爽欧美一区九九 | 理论片87福利理论电影 | 大地资源网第二页免费观看 | 一本久久a久久精品亚洲 | 国产精品理论片在线观看 | 亚洲中文字幕av在天堂 | 强奷人妻日本中文字幕 | 人妻互换免费中文字幕 | 日韩欧美中文字幕在线三区 | 鲁大师影院在线观看 | 精品人妻人人做人人爽夜夜爽 | 精品无码一区二区三区的天堂 | 乱人伦人妻中文字幕无码 | 久久亚洲国产成人精品性色 | 377p欧洲日本亚洲大胆 | 日日摸日日碰夜夜爽av | 成熟人妻av无码专区 | 久久亚洲中文字幕无码 | 国产精品.xx视频.xxtv | 88国产精品欧美一区二区三区 | 久久久中文久久久无码 | 日韩精品乱码av一区二区 | 夜夜高潮次次欢爽av女 | 人妻少妇精品久久 | 亚洲国产av精品一区二区蜜芽 | 疯狂三人交性欧美 | 国产在线aaa片一区二区99 | 国产香蕉尹人视频在线 | 伊人久久大香线焦av综合影院 | 又大又黄又粗又爽的免费视频 | 男人和女人高潮免费网站 | 无码帝国www无码专区色综合 | 乱码午夜-极国产极内射 | 中文字幕乱码人妻无码久久 | 亚洲精品国产第一综合99久久 | av在线亚洲欧洲日产一区二区 | 精品国产一区av天美传媒 | 国产偷自视频区视频 | 日本一卡2卡3卡四卡精品网站 | 精品无人国产偷自产在线 | 理论片87福利理论电影 | 国产办公室秘书无码精品99 | 无码乱肉视频免费大全合集 | 亚洲熟悉妇女xxx妇女av | 亚洲人成无码网www | 午夜精品一区二区三区的区别 | 国产片av国语在线观看 | 97精品人妻一区二区三区香蕉 | 欧美日韩人成综合在线播放 | 亚洲国产成人av在线观看 | 国产卡一卡二卡三 | 草草网站影院白丝内射 | 秋霞成人午夜鲁丝一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 麻豆人妻少妇精品无码专区 | 夜夜躁日日躁狠狠久久av | 国产又粗又硬又大爽黄老大爷视 | 伊人久久大香线蕉av一区二区 | 人妻无码αv中文字幕久久琪琪布 | 亚拍精品一区二区三区探花 | 国产精品亚洲а∨无码播放麻豆 | 伊人久久大香线焦av综合影院 | 国产精品久久久 | 久激情内射婷内射蜜桃人妖 | 国产成人无码区免费内射一片色欲 | 国产成人无码av片在线观看不卡 | 国产成人无码av片在线观看不卡 | 中文字幕无码日韩欧毛 | 欧美精品在线观看 | 国产成人精品一区二区在线小狼 | 噜噜噜亚洲色成人网站 | √天堂中文官网8在线 | 国产精品亚洲一区二区三区喷水 | 国产精品久久久久9999小说 | 日本熟妇乱子伦xxxx | 少妇厨房愉情理9仑片视频 | 午夜福利一区二区三区在线观看 | 国产精品99久久精品爆乳 | 亚洲自偷自拍另类第1页 | 波多野结衣av一区二区全免费观看 | 九九热爱视频精品 | 乱人伦人妻中文字幕无码 | 妺妺窝人体色www在线小说 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久人人爽人人爽人人片av高清 | 亚洲va欧美va天堂v国产综合 | 色一情一乱一伦一区二区三欧美 | 色综合视频一区二区三区 | 沈阳熟女露脸对白视频 | 国产成人午夜福利在线播放 | 国产精品久久福利网站 | 国产精品无码永久免费888 | 99久久久无码国产aaa精品 | 2020久久超碰国产精品最新 | 国产婷婷色一区二区三区在线 | 国产亚洲精品精品国产亚洲综合 | 高中生自慰www网站 | 装睡被陌生人摸出水好爽 | 欧美丰满少妇xxxx性 | 国产 精品 自在自线 | 台湾无码一区二区 | 亚洲国产av美女网站 | 亚洲色欲色欲天天天www | 人人妻人人澡人人爽欧美一区 | 蜜桃视频插满18在线观看 | 亚洲日韩av一区二区三区四区 | 国产精品无码一区二区三区不卡 | 4hu四虎永久在线观看 | 欧美第一黄网免费网站 | 国产农村妇女高潮大叫 | 国产无av码在线观看 | 欧美丰满老熟妇xxxxx性 | 午夜理论片yy44880影院 | 久久国产精品二国产精品 | 亚洲热妇无码av在线播放 | 亚洲国产精品一区二区美利坚 | 99久久精品日本一区二区免费 | 亚洲综合色区中文字幕 | 激情五月综合色婷婷一区二区 | 亚洲国精产品一二二线 | 欧美熟妇另类久久久久久不卡 | 人人爽人人澡人人高潮 | 人妻无码αv中文字幕久久琪琪布 | 国产精品无码mv在线观看 | 精品无码国产一区二区三区av | 内射巨臀欧美在线视频 | 亚欧洲精品在线视频免费观看 | 精品午夜福利在线观看 | 欧美丰满老熟妇xxxxx性 | 国色天香社区在线视频 | 欧美丰满少妇xxxx性 | 久久久久久a亚洲欧洲av冫 | 欧美xxxx黑人又粗又长 | 内射欧美老妇wbb | av人摸人人人澡人人超碰下载 | 亚洲aⅴ无码成人网站国产app | 国产无遮挡又黄又爽免费视频 | 国产精品久久久一区二区三区 | 久久久亚洲欧洲日产国码αv | 麻豆国产丝袜白领秘书在线观看 | 国产精品视频免费播放 | 精品熟女少妇av免费观看 | 永久免费观看美女裸体的网站 | 老子影院午夜精品无码 | 亚洲熟妇色xxxxx欧美老妇 | 天海翼激烈高潮到腰振不止 | 精品无码国产自产拍在线观看蜜 | 亚洲国产精品毛片av不卡在线 | 亚洲欧美日韩国产精品一区二区 | 亚洲成a人片在线观看无码 | 精品夜夜澡人妻无码av蜜桃 | 国产精品美女久久久 | 国产无av码在线观看 | 国内综合精品午夜久久资源 | 波多野结衣一区二区三区av免费 | 一本加勒比波多野结衣 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产成人精品久久亚洲高清不卡 | 亚洲日韩精品欧美一区二区 | 欧美日本日韩 | 国产色视频一区二区三区 | 波多野结衣乳巨码无在线观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 精品一二三区久久aaa片 | 日本免费一区二区三区最新 | 免费国产成人高清在线观看网站 | 老熟女重囗味hdxx69 | 亚洲の无码国产の无码步美 | 亚洲精品一区二区三区婷婷月 | 丝袜足控一区二区三区 | 秋霞特色aa大片 | 中文字幕人妻丝袜二区 | 成人免费无码大片a毛片 | 狠狠色丁香久久婷婷综合五月 | 爱做久久久久久 | 亚洲色偷偷偷综合网 | 青青青手机频在线观看 | 无码成人精品区在线观看 | 精品人妻av区 | 亚洲人成影院在线无码按摩店 | 色综合久久久无码中文字幕 | 4hu四虎永久在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 久久99国产综合精品 | 免费无码av一区二区 | 无码国内精品人妻少妇 | 中文字幕日韩精品一区二区三区 | 国产精品亚洲一区二区三区喷水 | 欧美三级a做爰在线观看 | 国产午夜视频在线观看 | 任你躁在线精品免费 | 久久久精品成人免费观看 | 俄罗斯老熟妇色xxxx | 亚洲日韩av一区二区三区四区 | www国产精品内射老师 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲国产欧美国产综合一区 | 精品人妻av区 | 自拍偷自拍亚洲精品被多人伦好爽 | 5858s亚洲色大成网站www | 成人亚洲精品久久久久软件 | 一本精品99久久精品77 | 亚洲国产成人a精品不卡在线 | 波多野结衣高清一区二区三区 | 久久这里只有精品视频9 | 欧美自拍另类欧美综合图片区 | 成人三级无码视频在线观看 | 欧美肥老太牲交大战 | 亚洲国产精品无码久久久久高潮 | 乌克兰少妇xxxx做受 | 动漫av网站免费观看 | 无码一区二区三区在线观看 | 97精品国产97久久久久久免费 | 国产高潮视频在线观看 | 欧美人与善在线com | 欧美人与善在线com | 亚洲精品国偷拍自产在线观看蜜桃 | 国产免费无码一区二区视频 | 欧美日韩久久久精品a片 | 一本加勒比波多野结衣 | 天堂亚洲2017在线观看 | 欧美性生交活xxxxxdddd | 中文毛片无遮挡高清免费 | 久久久婷婷五月亚洲97号色 | 色窝窝无码一区二区三区色欲 | 日本大乳高潮视频在线观看 | 一本久道久久综合狠狠爱 | 色欲久久久天天天综合网精品 | 日本xxxx色视频在线观看免费 | 亚洲 日韩 欧美 成人 在线观看 | 国产高清av在线播放 | 亚洲综合无码久久精品综合 | 成人一在线视频日韩国产 | 女人被男人爽到呻吟的视频 | 无码一区二区三区在线观看 | 久久久精品人妻久久影视 | 娇妻被黑人粗大高潮白浆 | 又大又硬又爽免费视频 | 国产小呦泬泬99精品 | 男女作爱免费网站 | 国产午夜无码视频在线观看 | 国产片av国语在线观看 | 国产成人无码区免费内射一片色欲 | 牲交欧美兽交欧美 | 国精品人妻无码一区二区三区蜜柚 | 乱码午夜-极国产极内射 | 午夜无码人妻av大片色欲 | 国产亚洲欧美日韩亚洲中文色 | 青草青草久热国产精品 | 日韩视频 中文字幕 视频一区 | 国产精品久久久久无码av色戒 | 国产精品内射视频免费 | 日日躁夜夜躁狠狠躁 | 日本一区二区三区免费高清 | 自拍偷自拍亚洲精品10p | 亚洲精品久久久久avwww潮水 | 国产亚洲精品久久久久久久 | 日韩精品一区二区av在线 | 未满成年国产在线观看 | 国产午夜亚洲精品不卡 | 人人妻人人澡人人爽欧美精品 | 一本无码人妻在中文字幕免费 | 亚洲一区二区三区在线观看网站 | 国产两女互慰高潮视频在线观看 | 东京无码熟妇人妻av在线网址 | 国产精品久久久久久无码 | 国产麻豆精品精东影业av网站 | 一本久久伊人热热精品中文字幕 | 女高中生第一次破苞av | 国产亚洲精品久久久闺蜜 | 一本色道久久综合亚洲精品不卡 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 扒开双腿吃奶呻吟做受视频 | 一区二区三区乱码在线 | 欧洲 | 中国女人内谢69xxxxxa片 | 国产人妻精品一区二区三区 | 大肉大捧一进一出好爽视频 | 97夜夜澡人人双人人人喊 | 日韩精品成人一区二区三区 | 欧美午夜特黄aaaaaa片 | 国产成人一区二区三区在线观看 | 欧美兽交xxxx×视频 | 国产精品久久久久无码av色戒 | 理论片87福利理论电影 | 中文字幕中文有码在线 | 日本大乳高潮视频在线观看 | 无码人妻精品一区二区三区不卡 | 久久久久久久久蜜桃 | 巨爆乳无码视频在线观看 | 亚洲精品综合一区二区三区在线 | 久久久久免费精品国产 | 亚洲成av人综合在线观看 | 无码国模国产在线观看 | 波多野结衣乳巨码无在线观看 | 强开小婷嫩苞又嫩又紧视频 | 中文字幕人妻无码一夲道 | 精品亚洲成av人在线观看 | 一本色道久久综合亚洲精品不卡 | 国产成人精品一区二区在线小狼 | 久久国产精品偷任你爽任你 | 国产精品资源一区二区 | 亚洲精品久久久久久久久久久 | 强伦人妻一区二区三区视频18 | 精品成在人线av无码免费看 | 国产精品久久国产精品99 | 国产精品无码永久免费888 | 日韩人妻无码中文字幕视频 | 蜜桃无码一区二区三区 | 国产精品久久精品三级 | 思思久久99热只有频精品66 | 国产av无码专区亚洲a∨毛片 | 小泽玛莉亚一区二区视频在线 | 国产无遮挡又黄又爽免费视频 | 亚洲爆乳大丰满无码专区 | 日日天日日夜日日摸 | 中文无码伦av中文字幕 | 精品久久久无码中文字幕 | 亚洲欧洲中文日韩av乱码 | 亚洲国产精品无码久久久久高潮 | 亚洲欧洲中文日韩av乱码 | 日韩精品无码一区二区中文字幕 | 人妻少妇精品无码专区二区 | 国产人妻久久精品二区三区老狼 | 午夜男女很黄的视频 | 国产综合久久久久鬼色 | 2020久久超碰国产精品最新 | 成人影院yy111111在线观看 | 国产超级va在线观看视频 | 久久久久久久人妻无码中文字幕爆 | 亚洲狠狠色丁香婷婷综合 | 久激情内射婷内射蜜桃人妖 | 亚洲娇小与黑人巨大交 | 人妻尝试又大又粗久久 | 精品无码国产自产拍在线观看蜜 | 久久人人97超碰a片精品 | 亚洲精品国偷拍自产在线麻豆 | 搡女人真爽免费视频大全 | 国产无遮挡又黄又爽又色 | 欧美熟妇另类久久久久久不卡 | 无码纯肉视频在线观看 | 熟女少妇人妻中文字幕 | 无码国产色欲xxxxx视频 | 亚洲成色www久久网站 | 精品国产一区av天美传媒 | 亚欧洲精品在线视频免费观看 | 欧美性猛交内射兽交老熟妇 | 欧美成人家庭影院 | 一二三四在线观看免费视频 | 国内精品九九久久久精品 | 人妻天天爽夜夜爽一区二区 | 亚洲精品综合五月久久小说 | 丰满岳乱妇在线观看中字无码 | 国内老熟妇对白xxxxhd | 久久国产精品精品国产色婷婷 | 中国女人内谢69xxxx | 色婷婷综合激情综在线播放 | 亚洲熟女一区二区三区 | 九九综合va免费看 | 无码人妻丰满熟妇区毛片18 | 国产肉丝袜在线观看 | 国产精品美女久久久 | 日韩无套无码精品 | 亚洲国产午夜精品理论片 | 熟妇人妻中文av无码 | 亚洲精品成人福利网站 | 国产精品久久久久9999小说 | 国产精品办公室沙发 | 精品国产一区二区三区四区 | 男人的天堂2018无码 | 在线成人www免费观看视频 | 夜夜高潮次次欢爽av女 | 国产亚洲人成a在线v网站 | 亚洲精品成人福利网站 | 精品水蜜桃久久久久久久 | 亚洲精品久久久久久久久久久 | 青青青爽视频在线观看 | 亚洲国产精品成人久久蜜臀 | 色爱情人网站 | 成 人 免费观看网站 | 天堂在线观看www | 国产福利视频一区二区 | 熟女体下毛毛黑森林 | 日日天干夜夜狠狠爱 | 久久人人爽人人人人片 | 欧洲极品少妇 | 国产真人无遮挡作爱免费视频 | 性生交大片免费看l | 国产疯狂伦交大片 | 麻豆蜜桃av蜜臀av色欲av | 久久99精品久久久久婷婷 | 精品人妻中文字幕有码在线 | 欧美日韩视频无码一区二区三 | 日本熟妇浓毛 | 国产精品人人爽人人做我的可爱 | 精品厕所偷拍各类美女tp嘘嘘 | 一本加勒比波多野结衣 | 日韩精品a片一区二区三区妖精 | 97久久国产亚洲精品超碰热 | 久久精品人人做人人综合 | 亚洲成av人影院在线观看 | 亚洲爆乳大丰满无码专区 | 中文精品久久久久人妻不卡 | 日本乱人伦片中文三区 | 在线播放免费人成毛片乱码 | 久青草影院在线观看国产 | 99久久久无码国产aaa精品 | 又紧又大又爽精品一区二区 | 中文字幕av无码一区二区三区电影 | 高中生自慰www网站 | 搡女人真爽免费视频大全 | 亚洲国产欧美国产综合一区 | 人妻少妇被猛烈进入中文字幕 | 国产电影无码午夜在线播放 | 精品无码国产一区二区三区av | 国产网红无码精品视频 | 日本饥渴人妻欲求不满 | 久久精品中文字幕大胸 | 欧美日韩视频无码一区二区三 | 我要看www免费看插插视频 | 内射欧美老妇wbb | 国产香蕉97碰碰久久人人 | 久久zyz资源站无码中文动漫 | 亚洲日韩av一区二区三区四区 | 精品国产福利一区二区 | 少妇高潮一区二区三区99 | 国产网红无码精品视频 | 熟妇激情内射com | 黑人巨大精品欧美黑寡妇 | 亚洲啪av永久无码精品放毛片 | 亚洲精品中文字幕乱码 | 日本丰满熟妇videos | 又色又爽又黄的美女裸体网站 | 国产婷婷色一区二区三区在线 | 国产亚洲精品久久久久久国模美 | 99久久人妻精品免费二区 | 人人澡人人透人人爽 | 丰满少妇弄高潮了www | 扒开双腿吃奶呻吟做受视频 | 国产精品多人p群无码 | 日韩成人一区二区三区在线观看 | 色五月五月丁香亚洲综合网 | 欧美 丝袜 自拍 制服 另类 | 麻豆国产人妻欲求不满 | 日韩精品无码一本二本三本色 | 特黄特色大片免费播放器图片 | 久久97精品久久久久久久不卡 | 大屁股大乳丰满人妻 | 欧美午夜特黄aaaaaa片 | 亚洲人成人无码网www国产 | 97夜夜澡人人双人人人喊 | 九九热爱视频精品 | 日韩无码专区 | 午夜性刺激在线视频免费 | 永久黄网站色视频免费直播 | 少女韩国电视剧在线观看完整 | 日日鲁鲁鲁夜夜爽爽狠狠 | 2020久久超碰国产精品最新 | 性色欲情网站iwww九文堂 | 日韩人妻无码中文字幕视频 | 精品日本一区二区三区在线观看 | 99er热精品视频 | 无码精品国产va在线观看dvd | 亚洲爆乳大丰满无码专区 | 一本久久a久久精品亚洲 | 无码乱肉视频免费大全合集 | 亚洲自偷精品视频自拍 | 俺去俺来也在线www色官网 | 无码人妻丰满熟妇区毛片18 | 国产乱子伦视频在线播放 | 天堂一区人妻无码 | 人妻体内射精一区二区三四 | 久久99精品国产麻豆蜜芽 | 亚洲精品一区二区三区四区五区 | 一区二区三区高清视频一 | 亚洲中文字幕va福利 | 乱人伦中文视频在线观看 | 一本大道伊人av久久综合 | 欧美性色19p | 亚洲精品中文字幕乱码 | 一本一道久久综合久久 | 亚洲日本va午夜在线电影 | 日韩精品成人一区二区三区 | 伊人久久大香线蕉亚洲 | 国产九九九九九九九a片 | 国产精品福利视频导航 | 国产精品多人p群无码 | 女人色极品影院 | 在线a亚洲视频播放在线观看 | √天堂中文官网8在线 | 在线а√天堂中文官网 | 国产亚洲精品久久久久久大师 | 日本熟妇乱子伦xxxx | 天天做天天爱天天爽综合网 | 丰满少妇高潮惨叫视频 | 精品一区二区三区无码免费视频 | 欧美日韩综合一区二区三区 | 亚洲经典千人经典日产 | 国产在线aaa片一区二区99 | 日韩av激情在线观看 | 人妻少妇被猛烈进入中文字幕 | 亚洲国产欧美日韩精品一区二区三区 | 三上悠亚人妻中文字幕在线 | 人妻无码αv中文字幕久久琪琪布 | 日日麻批免费40分钟无码 | 欧美成人高清在线播放 | 女人被爽到呻吟gif动态图视看 | 欧美freesex黑人又粗又大 | 55夜色66夜色国产精品视频 | 亚洲人成网站色7799 | 日本www一道久久久免费榴莲 | 精品无码一区二区三区爱欲 | 国产人妻精品一区二区三区不卡 | 欧美老人巨大xxxx做受 | 黑人粗大猛烈进出高潮视频 | 久久国产自偷自偷免费一区调 | 丰满少妇高潮惨叫视频 | 荫蒂添的好舒服视频囗交 | 99久久精品午夜一区二区 | 精品乱子伦一区二区三区 | 97色伦图片97综合影院 | 国产香蕉尹人视频在线 | 国产xxx69麻豆国语对白 | 国产亚洲精品精品国产亚洲综合 | 亚洲热妇无码av在线播放 | 高潮毛片无遮挡高清免费视频 | 成人欧美一区二区三区黑人免费 | 国产高清av在线播放 | 一个人看的www免费视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 一区二区传媒有限公司 | 天天拍夜夜添久久精品大 | 国产色精品久久人妻 | 无遮挡国产高潮视频免费观看 | 国产精品a成v人在线播放 | 国产小呦泬泬99精品 | 人妻熟女一区 | 蜜桃臀无码内射一区二区三区 | 国产真实乱对白精彩久久 | 天干天干啦夜天干天2017 | 欧美猛少妇色xxxxx | 亚洲色欲色欲欲www在线 | 少妇被黑人到高潮喷出白浆 | 精品无码一区二区三区的天堂 | 天下第一社区视频www日本 | 久青草影院在线观看国产 | 精品国产一区二区三区av 性色 | 久久这里只有精品视频9 | 亚洲精品中文字幕 | а√天堂www在线天堂小说 | 久9re热视频这里只有精品 | 免费国产成人高清在线观看网站 | 强辱丰满人妻hd中文字幕 | aⅴ在线视频男人的天堂 | 97久久精品无码一区二区 | 国产成人无码av一区二区 | 麻豆果冻传媒2021精品传媒一区下载 | 天天躁夜夜躁狠狠是什么心态 | 欧美日韩一区二区免费视频 | 六月丁香婷婷色狠狠久久 | 色婷婷综合中文久久一本 | 丰满人妻翻云覆雨呻吟视频 | 久久久成人毛片无码 | 中文字幕乱妇无码av在线 | 男人的天堂2018无码 | 麻豆国产丝袜白领秘书在线观看 | 精品一二三区久久aaa片 | 国产综合久久久久鬼色 | 俺去俺来也www色官网 | 久久亚洲中文字幕无码 | 亚洲国产精品久久久天堂 | 久久国产劲爆∧v内射 | 精品国产aⅴ无码一区二区 | 99精品无人区乱码1区2区3区 | 久久精品国产99精品亚洲 | 亚洲成a人片在线观看无码3d | 内射后入在线观看一区 | 成人性做爰aaa片免费看不忠 | 亚洲高清偷拍一区二区三区 | 99久久精品午夜一区二区 | 又大又硬又黄的免费视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲啪av永久无码精品放毛片 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲成熟女人毛毛耸耸多 | а天堂中文在线官网 | 女人被爽到呻吟gif动态图视看 | 欧美三级不卡在线观看 | 天天摸天天透天天添 | 国产成人精品视频ⅴa片软件竹菊 | 少妇性荡欲午夜性开放视频剧场 | 影音先锋中文字幕无码 | 亚洲精品国产第一综合99久久 | 亚洲人成无码网www | 欧美人与善在线com | 亚洲中文字幕久久无码 | 国内丰满熟女出轨videos | 久久久久亚洲精品男人的天堂 | 精品人妻人人做人人爽 | 亚洲国产精品久久人人爱 | 国产一精品一av一免费 | 久久久久亚洲精品男人的天堂 | 55夜色66夜色国产精品视频 | 精品人妻中文字幕有码在线 | 久久精品视频在线看15 | 日本护士xxxxhd少妇 | 亚洲码国产精品高潮在线 | aⅴ亚洲 日韩 色 图网站 播放 | 久久久久久久人妻无码中文字幕爆 | 蜜桃视频插满18在线观看 | 亚洲午夜久久久影院 | 亚洲色www成人永久网址 | 亚洲欧美日韩国产精品一区二区 | 亚洲欧美精品aaaaaa片 | 欧美zoozzooz性欧美 | 青青久在线视频免费观看 | 伊人久久大香线蕉午夜 | 在线亚洲高清揄拍自拍一品区 | 人人妻人人澡人人爽精品欧美 | 国产成人精品一区二区在线小狼 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美怡红院免费全部视频 | 人妻体内射精一区二区三四 | 亚洲 另类 在线 欧美 制服 | 婷婷六月久久综合丁香 | 国产又爽又猛又粗的视频a片 | 日日干夜夜干 | 久久久精品成人免费观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 午夜无码人妻av大片色欲 | 精品无人国产偷自产在线 | 六十路熟妇乱子伦 | 无码av岛国片在线播放 | 成在人线av无码免费 | 妺妺窝人体色www在线小说 | 欧美丰满老熟妇xxxxx性 | 熟女俱乐部五十路六十路av | 人人爽人人澡人人人妻 | 蜜桃视频韩日免费播放 | 国产精品亚洲综合色区韩国 | 日日鲁鲁鲁夜夜爽爽狠狠 | 任你躁国产自任一区二区三区 | 美女毛片一区二区三区四区 | 亚洲第一无码av无码专区 | 国产精品久久久av久久久 | 久久久无码中文字幕久... | 国产猛烈高潮尖叫视频免费 | 亚洲大尺度无码无码专区 | 亚洲色成人中文字幕网站 | 久久国产精品偷任你爽任你 | 亚洲精品午夜无码电影网 | 日本免费一区二区三区最新 | 亚洲午夜久久久影院 | 熟女体下毛毛黑森林 | 婷婷综合久久中文字幕蜜桃三电影 | 又大又紧又粉嫩18p少妇 | 亚洲精品成人av在线 | 亚洲 激情 小说 另类 欧美 | 亚洲乱码日产精品bd | 在线观看欧美一区二区三区 | 国内少妇偷人精品视频 | 天天拍夜夜添久久精品大 | 东京热无码av男人的天堂 | 欧美亚洲日韩国产人成在线播放 | 131美女爱做视频 | 久久国产36精品色熟妇 | 国产人妻久久精品二区三区老狼 | 99久久人妻精品免费二区 | 成人免费无码大片a毛片 | 久久人人爽人人爽人人片ⅴ | 国产片av国语在线观看 | 国产电影无码午夜在线播放 | 丰满少妇人妻久久久久久 | 老熟妇仑乱视频一区二区 | 国产av无码专区亚洲awww | 亚洲精品午夜无码电影网 | 精品无码一区二区三区的天堂 | 成人性做爰aaa片免费看不忠 | 国产成人精品视频ⅴa片软件竹菊 | 女高中生第一次破苞av | 精品一区二区三区无码免费视频 | 任你躁国产自任一区二区三区 | 久久精品人人做人人综合试看 | 国产亚洲精品久久久久久国模美 | 又色又爽又黄的美女裸体网站 | 在线观看免费人成视频 | 国产精品无码一区二区桃花视频 | 国产亚洲人成在线播放 | 国产熟女一区二区三区四区五区 | 欧美老妇与禽交 | 2019nv天堂香蕉在线观看 | 亚洲精品综合一区二区三区在线 | 欧美精品国产综合久久 | 乌克兰少妇性做爰 | 中文字幕无码日韩专区 | 一本色道婷婷久久欧美 | 成人动漫在线观看 | 国产在热线精品视频 | 在线精品国产一区二区三区 | 国产精品怡红院永久免费 | 亚洲爆乳大丰满无码专区 | 又色又爽又黄的美女裸体网站 | 一本色道婷婷久久欧美 | 日本护士毛茸茸高潮 | 最近免费中文字幕中文高清百度 | 中文字幕av伊人av无码av | 亚洲 欧美 激情 小说 另类 | 老司机亚洲精品影院 | 少妇激情av一区二区 | 日韩欧美中文字幕在线三区 | 国产69精品久久久久app下载 | 精品乱子伦一区二区三区 | 色欲久久久天天天综合网精品 | 内射巨臀欧美在线视频 | 精品无码国产一区二区三区av | 成人无码影片精品久久久 | 秋霞特色aa大片 | 久久99久久99精品中文字幕 | 又粗又大又硬又长又爽 | 日韩精品无码免费一区二区三区 | 性啪啪chinese东北女人 | 动漫av一区二区在线观看 | 国产香蕉尹人综合在线观看 | 中文亚洲成a人片在线观看 | 亚洲一区二区三区香蕉 | 中文字幕中文有码在线 | av在线亚洲欧洲日产一区二区 | 久青草影院在线观看国产 | 国产办公室秘书无码精品99 | 亚洲の无码国产の无码影院 | 国产精品无码一区二区三区不卡 | 天下第一社区视频www日本 | 国产激情综合五月久久 | 免费乱码人妻系列无码专区 | 少妇性俱乐部纵欲狂欢电影 | 高清国产亚洲精品自在久久 | 中文字幕中文有码在线 | 六十路熟妇乱子伦 | 国产精品久久久av久久久 | 欧洲熟妇精品视频 | 久久zyz资源站无码中文动漫 | 无遮挡国产高潮视频免费观看 | 一个人看的视频www在线 | 国产农村乱对白刺激视频 | 精品一区二区不卡无码av | 丰满护士巨好爽好大乳 | 久久成人a毛片免费观看网站 | 亚洲国产精品无码一区二区三区 | 老熟女乱子伦 | 99久久婷婷国产综合精品青草免费 | 国产精品久久国产精品99 | 国产精品久久久久7777 | 蜜桃无码一区二区三区 | 亚洲日韩av一区二区三区四区 | 国产口爆吞精在线视频 | 3d动漫精品啪啪一区二区中 | 最新国产麻豆aⅴ精品无码 | 国产精品美女久久久久av爽李琼 | 狂野欧美性猛xxxx乱大交 | 蜜桃臀无码内射一区二区三区 | 免费男性肉肉影院 | 国产女主播喷水视频在线观看 | 亚洲无人区一区二区三区 | 亚洲爆乳无码专区 | 图片小说视频一区二区 | 无码纯肉视频在线观看 | 亚洲成在人网站无码天堂 | 国产精品多人p群无码 | 国产精品久久福利网站 | 18黄暴禁片在线观看 | 中文字幕人妻丝袜二区 | 成人一在线视频日韩国产 | 中文字幕无码人妻少妇免费 | 呦交小u女精品视频 | 亚洲熟妇色xxxxx欧美老妇y | 久久久久久av无码免费看大片 | 色欲人妻aaaaaaa无码 | 人妻中文无码久热丝袜 | 国产在热线精品视频 | 图片区 小说区 区 亚洲五月 | 国产精品美女久久久久av爽李琼 | 国产成人精品三级麻豆 | 国产色xx群视频射精 | 久久久久亚洲精品中文字幕 | 久久97精品久久久久久久不卡 | 久久精品女人的天堂av | 在线观看国产一区二区三区 | 一个人看的视频www在线 | 亚洲色欲色欲欲www在线 | 亚洲国产精品一区二区美利坚 | 男女性色大片免费网站 | 俺去俺来也在线www色官网 | 国产无套内射久久久国产 | 亚洲精品美女久久久久久久 | 麻豆果冻传媒2021精品传媒一区下载 | 无码人中文字幕 | 大肉大捧一进一出好爽视频 | 欧美黑人巨大xxxxx | 国产乱人偷精品人妻a片 | 国产精品亚洲а∨无码播放麻豆 | 黑人巨大精品欧美黑寡妇 | 红桃av一区二区三区在线无码av | 久久久av男人的天堂 | 永久免费观看国产裸体美女 | 国产人成高清在线视频99最全资源 | 无码乱肉视频免费大全合集 | 骚片av蜜桃精品一区 | 国产免费无码一区二区视频 | 色一情一乱一伦一区二区三欧美 | 国产成人无码午夜视频在线观看 | 色五月五月丁香亚洲综合网 | 成人亚洲精品久久久久 | 欧美熟妇另类久久久久久多毛 | 51国偷自产一区二区三区 | 国产亚洲人成在线播放 | 国产人妻久久精品二区三区老狼 | 18无码粉嫩小泬无套在线观看 | 亚洲欧美中文字幕5发布 | 日本精品久久久久中文字幕 | 久久久久久久久888 | 久久久www成人免费毛片 | 欧美成人家庭影院 | 青草视频在线播放 | 国产av剧情md精品麻豆 | 中文字幕无码视频专区 | 永久免费观看美女裸体的网站 | 国产激情综合五月久久 | 在线播放免费人成毛片乱码 | 国产人妻人伦精品 | 青青青手机频在线观看 | 国产xxx69麻豆国语对白 | 欧美性猛交内射兽交老熟妇 | 无码精品国产va在线观看dvd | 人人妻人人澡人人爽精品欧美 | 偷窥日本少妇撒尿chinese | 色欲久久久天天天综合网精品 | 久久精品人妻少妇一区二区三区 | 日本又色又爽又黄的a片18禁 | 狠狠色噜噜狠狠狠7777奇米 | 成人女人看片免费视频放人 | 亚洲日本在线电影 | 亚洲va中文字幕无码久久不卡 | 中文字幕人成乱码熟女app | 欧美性猛交内射兽交老熟妇 | 欧美性猛交内射兽交老熟妇 | 麻豆国产人妻欲求不满谁演的 | 亚洲成av人片在线观看无码不卡 | 婷婷五月综合缴情在线视频 | 欧美成人免费全部网站 | 欧美高清在线精品一区 | 久久精品中文闷骚内射 | 丝袜美腿亚洲一区二区 | 亚洲日韩精品欧美一区二区 | 永久免费精品精品永久-夜色 | 在线天堂新版最新版在线8 | 国产精品久久久午夜夜伦鲁鲁 | 青草青草久热国产精品 | 曰韩少妇内射免费播放 | 亚洲成av人在线观看网址 | 精品国产成人一区二区三区 | 亚洲中文字幕久久无码 | 久久久久亚洲精品男人的天堂 | 国产两女互慰高潮视频在线观看 | 国产精品无码永久免费888 | 国产精品久久久久无码av色戒 | 久久精品国产一区二区三区肥胖 | 国产精品内射视频免费 | 白嫩日本少妇做爰 | 国产高清不卡无码视频 | 国产成人精品视频ⅴa片软件竹菊 | 丁香花在线影院观看在线播放 | 亚洲区欧美区综合区自拍区 | 日本免费一区二区三区最新 | 国产午夜福利亚洲第一 | 青春草在线视频免费观看 | 99国产精品白浆在线观看免费 | 久久久无码中文字幕久... | 欧洲欧美人成视频在线 | 国产激情一区二区三区 | av人摸人人人澡人人超碰下载 | 人妻无码αv中文字幕久久琪琪布 | 蜜桃av抽搐高潮一区二区 | 久久99热只有频精品8 | 亚洲欧美精品伊人久久 | 奇米影视888欧美在线观看 | 亚洲色大成网站www | 欧美 日韩 人妻 高清 中文 | 久久无码人妻影院 | 国产一区二区不卡老阿姨 | 亚洲一区二区三区国产精华液 | 人人妻人人藻人人爽欧美一区 | 国产偷自视频区视频 | 少妇无码一区二区二三区 | 亚洲精品综合一区二区三区在线 | 色情久久久av熟女人妻网站 | 99久久无码一区人妻 | 婷婷六月久久综合丁香 | 色妞www精品免费视频 | 水蜜桃亚洲一二三四在线 | 奇米影视7777久久精品人人爽 | 无码人妻出轨黑人中文字幕 | 曰韩无码二三区中文字幕 | 少妇人妻av毛片在线看 | 蜜臀aⅴ国产精品久久久国产老师 | 99久久精品日本一区二区免费 | 奇米影视888欧美在线观看 | 久久久久99精品成人片 | 国产人成高清在线视频99最全资源 | 成在人线av无码免观看麻豆 | 亚洲国产精品久久人人爱 | 我要看www免费看插插视频 | 美女极度色诱视频国产 | 乌克兰少妇xxxx做受 | 又大又紧又粉嫩18p少妇 | 国产成人亚洲综合无码 | 妺妺窝人体色www在线小说 | 国产午夜无码精品免费看 | 老司机亚洲精品影院 | 久久zyz资源站无码中文动漫 | 成年美女黄网站色大免费视频 | 欧美 日韩 人妻 高清 中文 | 色婷婷综合激情综在线播放 | 九九综合va免费看 | 午夜精品一区二区三区的区别 | 成人亚洲精品久久久久软件 | 免费看男女做好爽好硬视频 | 少妇无码av无码专区在线观看 | 国产舌乚八伦偷品w中 | 日韩人妻无码中文字幕视频 | 黑人玩弄人妻中文在线 | 国产成人综合色在线观看网站 | 动漫av一区二区在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 曰本女人与公拘交酡免费视频 | 小sao货水好多真紧h无码视频 | 乱码av麻豆丝袜熟女系列 | 中文无码伦av中文字幕 | 欧美精品免费观看二区 | 日日天日日夜日日摸 | 精品久久久无码人妻字幂 | 一本色道婷婷久久欧美 | 综合人妻久久一区二区精品 | 真人与拘做受免费视频 | 亚洲成a人片在线观看无码3d | 久久综合久久自在自线精品自 | 欧美三级不卡在线观看 | 亚洲 激情 小说 另类 欧美 | 国产午夜亚洲精品不卡 | 性色欲网站人妻丰满中文久久不卡 | 一个人看的www免费视频在线观看 | 精品 日韩 国产 欧美 视频 | 久久人人爽人人爽人人片ⅴ | 欧美熟妇另类久久久久久多毛 | 久久99精品久久久久久 | 久久99热只有频精品8 | 国产做国产爱免费视频 | 性欧美熟妇videofreesex | 好爽又高潮了毛片免费下载 | 精品无码国产一区二区三区av | 无码人妻久久一区二区三区不卡 | 一本色道婷婷久久欧美 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 任你躁在线精品免费 | 99久久久国产精品无码免费 | 国产午夜亚洲精品不卡下载 | 永久黄网站色视频免费直播 | 性欧美大战久久久久久久 | 丰满人妻一区二区三区免费视频 | 日本精品高清一区二区 | 国产莉萝无码av在线播放 | aⅴ亚洲 日韩 色 图网站 播放 | 又紧又大又爽精品一区二区 | 精品国产一区av天美传媒 | 国产成人午夜福利在线播放 | 99久久精品日本一区二区免费 | 人妻插b视频一区二区三区 | 亚洲成a人片在线观看日本 | 夜精品a片一区二区三区无码白浆 | 国产精品久久久久久亚洲影视内衣 | 人妻无码αv中文字幕久久琪琪布 | 欧美精品国产综合久久 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 波多野结衣一区二区三区av免费 | 宝宝好涨水快流出来免费视频 | 色婷婷久久一区二区三区麻豆 | 一本一道久久综合久久 | 精品无人区无码乱码毛片国产 | 国产乱人无码伦av在线a | 日韩精品无码一区二区中文字幕 | 免费男性肉肉影院 | 一区二区三区高清视频一 | 亚洲精品国产a久久久久久 | 久久天天躁狠狠躁夜夜免费观看 | 国产婷婷色一区二区三区在线 | 毛片内射-百度 | 国产一区二区三区影院 | 国产麻豆精品一区二区三区v视界 | 久久久久国色av免费观看性色 | 精品欧洲av无码一区二区三区 | 无码一区二区三区在线 | 亚洲人交乣女bbw | 人人澡人人妻人人爽人人蜜桃 | 精品国产成人一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 骚片av蜜桃精品一区 | 无码av免费一区二区三区试看 | 久久综合久久自在自线精品自 | 丰腴饱满的极品熟妇 | 精品国产国产综合精品 | 天天爽夜夜爽夜夜爽 | 国产精品国产自线拍免费软件 | 欧美野外疯狂做受xxxx高潮 | 国产成人精品视频ⅴa片软件竹菊 | 一本色道久久综合狠狠躁 | 欧美zoozzooz性欧美 | 亚洲人成影院在线观看 | 天堂а√在线中文在线 | 高中生自慰www网站 | 无码成人精品区在线观看 | √天堂资源地址中文在线 | 亚洲成a人片在线观看日本 | 东京热无码av男人的天堂 | 中文字幕 人妻熟女 | 久久伊人色av天堂九九小黄鸭 | 国产激情艳情在线看视频 | 国产精品18久久久久久麻辣 | 国产亚洲精品精品国产亚洲综合 | 国产精品高潮呻吟av久久 | 丰满妇女强制高潮18xxxx | 成 人 免费观看网站 | 国产激情无码一区二区 | 亚洲国产欧美在线成人 | 人妻中文无码久热丝袜 | 亚洲国产精品毛片av不卡在线 | 男女爱爱好爽视频免费看 | 国产精品igao视频网 | 欧洲熟妇精品视频 | 久久精品中文字幕大胸 | 偷窥日本少妇撒尿chinese | 九九热爱视频精品 | ass日本丰满熟妇pics | 又大又硬又爽免费视频 | 小鲜肉自慰网站xnxx | 四虎永久在线精品免费网址 | 九月婷婷人人澡人人添人人爽 | 成人亚洲精品久久久久 | www成人国产高清内射 | 久久久www成人免费毛片 | 成人无码精品1区2区3区免费看 | 国产成人无码区免费内射一片色欲 | 亚洲乱码中文字幕在线 | 久久综合九色综合97网 | 任你躁在线精品免费 | 99精品久久毛片a片 | 一本色道久久综合亚洲精品不卡 | 国产成人无码一二三区视频 | 7777奇米四色成人眼影 | 老熟妇乱子伦牲交视频 | 乱码av麻豆丝袜熟女系列 | 少妇无套内谢久久久久 | 国产手机在线αⅴ片无码观看 | 国产亚洲精品精品国产亚洲综合 | 成人试看120秒体验区 | 熟妇激情内射com | 国产精品久久国产三级国 | 国产后入清纯学生妹 | 青青久在线视频免费观看 | 熟女体下毛毛黑森林 | 久久www免费人成人片 | 国产精品久久久久久久影院 | 麻豆精品国产精华精华液好用吗 | 人人妻在人人 | 人人妻人人澡人人爽精品欧美 | 在线看片无码永久免费视频 | 国产亚洲tv在线观看 | 99久久精品日本一区二区免费 | 少妇被黑人到高潮喷出白浆 | 99精品无人区乱码1区2区3区 | 少妇被粗大的猛进出69影院 | 又粗又大又硬又长又爽 | 精品日本一区二区三区在线观看 | 亚洲а∨天堂久久精品2021 | 国产电影无码午夜在线播放 | 亚洲欧美中文字幕5发布 | 青青青手机频在线观看 | а√天堂www在线天堂小说 | 亚洲aⅴ无码成人网站国产app | 奇米影视7777久久精品 | 久久人人爽人人爽人人片av高清 | 午夜精品久久久久久久 | 国产亚av手机在线观看 | 人人爽人人澡人人人妻 | 久激情内射婷内射蜜桃人妖 | 亚洲欧美精品伊人久久 | 亚洲欧洲无卡二区视頻 | aⅴ在线视频男人的天堂 | www国产亚洲精品久久久日本 | 国产人妻人伦精品 | 撕开奶罩揉吮奶头视频 | 日韩精品乱码av一区二区 | 国产精品自产拍在线观看 | 无遮挡啪啪摇乳动态图 | 初尝人妻少妇中文字幕 | 日本又色又爽又黄的a片18禁 | 日日干夜夜干 | 撕开奶罩揉吮奶头视频 | 亚洲熟妇色xxxxx欧美老妇 | 成人无码视频在线观看网站 | 4hu四虎永久在线观看 | 高清不卡一区二区三区 | 国产在线精品一区二区高清不卡 | 人人妻人人澡人人爽精品欧美 | 免费人成网站视频在线观看 | 国产特级毛片aaaaaa高潮流水 | 亚洲综合无码一区二区三区 | 国产在线无码精品电影网 | 日本一区二区三区免费高清 | 婷婷丁香六月激情综合啪 | 日本www一道久久久免费榴莲 | 岛国片人妻三上悠亚 | v一区无码内射国产 | 99久久久无码国产精品免费 | 色 综合 欧美 亚洲 国产 | www国产亚洲精品久久网站 | 国产精品无码成人午夜电影 | av无码不卡在线观看免费 | 国产内射爽爽大片视频社区在线 | 亚洲精品一区二区三区四区五区 | 亚洲午夜久久久影院 | 久久99久久99精品中文字幕 | 国产超级va在线观看视频 | 国产亚洲精品久久久ai换 | 日韩欧美中文字幕公布 | 精品久久久久久亚洲精品 | 久久久久久av无码免费看大片 | 色欲综合久久中文字幕网 | 亚洲国产综合无码一区 | 九九在线中文字幕无码 | 久久久无码中文字幕久... | 日韩成人一区二区三区在线观看 | 麻豆成人精品国产免费 | 999久久久国产精品消防器材 | 国内少妇偷人精品视频免费 | 久久久久国色av免费观看性色 | 成人无码精品一区二区三区 | 午夜理论片yy44880影院 | 午夜成人1000部免费视频 | 亚洲小说图区综合在线 | 成人一在线视频日韩国产 | 1000部啪啪未满十八勿入下载 | 风流少妇按摩来高潮 | 国产精品久久久久久亚洲影视内衣 | 青草视频在线播放 | 国产精品久久久一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 综合网日日天干夜夜久久 | 丰满少妇熟乱xxxxx视频 | 小泽玛莉亚一区二区视频在线 | 又大又黄又粗又爽的免费视频 | 久久99国产综合精品 | 精品 日韩 国产 欧美 视频 | 亚洲高清偷拍一区二区三区 | 色妞www精品免费视频 | 中文字幕av伊人av无码av | 娇妻被黑人粗大高潮白浆 | 国产真实乱对白精彩久久 | 男女猛烈xx00免费视频试看 | 色综合久久88色综合天天 | 国产成人午夜福利在线播放 | 国产一区二区三区四区五区加勒比 | 一本久道久久综合狠狠爱 | 亚洲国产欧美日韩精品一区二区三区 | 久久久久成人精品免费播放动漫 | 精品国产一区二区三区四区在线看 | 午夜肉伦伦影院 | 国产在线无码精品电影网 | 无码国内精品人妻少妇 | 国模大胆一区二区三区 | 日韩精品无码一区二区中文字幕 | 成 人 免费观看网站 | 欧美性猛交内射兽交老熟妇 | 欧美真人作爱免费视频 | 久久97精品久久久久久久不卡 | 国产精品毛多多水多 | 鲁一鲁av2019在线 | 18精品久久久无码午夜福利 | 欧美丰满老熟妇xxxxx性 | 丰满肥臀大屁股熟妇激情视频 | 免费乱码人妻系列无码专区 | 真人与拘做受免费视频 | 午夜福利试看120秒体验区 | 99精品无人区乱码1区2区3区 | √天堂中文官网8在线 | 国产av人人夜夜澡人人爽麻豆 | 狂野欧美性猛xxxx乱大交 | 日韩精品成人一区二区三区 | 国产超碰人人爽人人做人人添 | 欧美性生交活xxxxxdddd | 精品国产一区二区三区av 性色 | 欧美 日韩 人妻 高清 中文 | 亚洲日韩一区二区 | 国产人妻精品一区二区三区不卡 | 国产在线精品一区二区高清不卡 | 国产精品久久国产精品99 | 成人女人看片免费视频放人 | 极品尤物被啪到呻吟喷水 | 四虎国产精品一区二区 | 成人免费视频在线观看 | 特大黑人娇小亚洲女 | 亚洲成a人片在线观看无码3d | 欧美日韩视频无码一区二区三 | 四十如虎的丰满熟妇啪啪 | 无套内射视频囯产 | 久久综合给合久久狠狠狠97色 | 久久久久99精品成人片 | 无码av免费一区二区三区试看 | 99久久精品国产一区二区蜜芽 | 午夜福利一区二区三区在线观看 | 内射爽无广熟女亚洲 | 小泽玛莉亚一区二区视频在线 | 亚洲精品午夜国产va久久成人 | 婷婷丁香六月激情综合啪 | 欧美人与动性行为视频 | 亚洲一区av无码专区在线观看 | 色综合久久久无码中文字幕 | 特黄特色大片免费播放器图片 | 精品无码成人片一区二区98 | 最近的中文字幕在线看视频 | 麻花豆传媒剧国产免费mv在线 | 色综合久久88色综合天天 | 久久人人爽人人爽人人片ⅴ | 四虎国产精品免费久久 | 色欲av亚洲一区无码少妇 | 国产真实夫妇视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 美女极度色诱视频国产 | 久久综合给合久久狠狠狠97色 | 特级做a爰片毛片免费69 | 伊人久久大香线蕉午夜 | 色一情一乱一伦 | 精品人妻中文字幕有码在线 | 荫蒂添的好舒服视频囗交 | 99久久精品无码一区二区毛片 | 成人性做爰aaa片免费看 | 天干天干啦夜天干天2017 | 欧美亚洲日韩国产人成在线播放 | 欧美freesex黑人又粗又大 | 日韩欧美群交p片內射中文 | 国产精品鲁鲁鲁 | 亚洲成av人影院在线观看 | 亚洲精品中文字幕乱码 | 久久久久久久人妻无码中文字幕爆 | 天天爽夜夜爽夜夜爽 | 女高中生第一次破苞av | 俺去俺来也在线www色官网 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久精品丝袜高跟鞋 | 蜜桃视频插满18在线观看 | 精品日本一区二区三区在线观看 | 日韩精品久久久肉伦网站 | 久久亚洲日韩精品一区二区三区 | 初尝人妻少妇中文字幕 | 亚洲伊人久久精品影院 | 激情内射亚州一区二区三区爱妻 | 中文字幕乱码人妻无码久久 | 国产av久久久久精东av | 无码免费一区二区三区 | 无码精品国产va在线观看dvd | 亚洲综合久久一区二区 | 亚洲精品久久久久avwww潮水 | 国产乱人无码伦av在线a | 亚洲色成人中文字幕网站 | 风流少妇按摩来高潮 | 国产亲子乱弄免费视频 | 国产精品视频免费播放 | 色婷婷香蕉在线一区二区 | 性啪啪chinese东北女人 | 日本一卡二卡不卡视频查询 | 成人性做爰aaa片免费看不忠 | 无遮无挡爽爽免费视频 | 久久久久成人片免费观看蜜芽 | 老熟女重囗味hdxx69 | 国产精品无码永久免费888 | 亚洲男人av香蕉爽爽爽爽 | 国产熟妇高潮叫床视频播放 | 成人欧美一区二区三区黑人免费 | 无码一区二区三区在线 | 台湾无码一区二区 | √天堂中文官网8在线 | 亚洲s码欧洲m码国产av | 久久久精品456亚洲影院 | 天天躁夜夜躁狠狠是什么心态 | 久久视频在线观看精品 | 久久精品国产99久久6动漫 | 亚洲成a人一区二区三区 | 国产日产欧产精品精品app | 久久zyz资源站无码中文动漫 | 亚洲中文字幕成人无码 | 国产亚洲精品久久久久久久 | 三级4级全黄60分钟 | 少妇高潮一区二区三区99 | 狠狠亚洲超碰狼人久久 | 国产亚洲日韩欧美另类第八页 | 日本免费一区二区三区最新 | 国产欧美精品一区二区三区 | 久久国产精品_国产精品 | 国产午夜无码精品免费看 | 老熟妇仑乱视频一区二区 | 高潮喷水的毛片 | 久久国内精品自在自线 | 欧美变态另类xxxx | 国产精品无码一区二区桃花视频 | 亚洲欧洲日本综合aⅴ在线 | 麻豆国产丝袜白领秘书在线观看 | 欧美乱妇无乱码大黄a片 | 久久这里只有精品视频9 | 人妻aⅴ无码一区二区三区 | 2020久久香蕉国产线看观看 | 人人妻人人澡人人爽人人精品浪潮 | 色综合久久88色综合天天 | 欧美精品无码一区二区三区 | 亚洲国产精品毛片av不卡在线 | 夜夜躁日日躁狠狠久久av | 国产精品久久久久久无码 | 久久国语露脸国产精品电影 | 日本精品久久久久中文字幕 | 日日摸天天摸爽爽狠狠97 | 国产成人精品久久亚洲高清不卡 | 初尝人妻少妇中文字幕 | 人人妻人人藻人人爽欧美一区 | 55夜色66夜色国产精品视频 | 奇米影视888欧美在线观看 | 中文精品无码中文字幕无码专区 | 欧美丰满老熟妇xxxxx性 | 秋霞特色aa大片 | 男女猛烈xx00免费视频试看 | 激情爆乳一区二区三区 | 亚洲成a人片在线观看无码 | 亚洲乱码中文字幕在线 | 鲁鲁鲁爽爽爽在线视频观看 | 国产亚洲美女精品久久久2020 | 久久99热只有频精品8 | 久久久久久久人妻无码中文字幕爆 | 人妻少妇被猛烈进入中文字幕 | 久久99精品国产麻豆蜜芽 | 国产一区二区三区精品视频 | 5858s亚洲色大成网站www | 秋霞特色aa大片 | 亚洲中文字幕无码一久久区 | 亚洲中文字幕无码中文字在线 | 黑人玩弄人妻中文在线 | 伊人色综合久久天天小片 | 双乳奶水饱满少妇呻吟 | 国产精品鲁鲁鲁 | 中文字幕中文有码在线 | 亚洲精品国产品国语在线观看 | 亚无码乱人伦一区二区 | 中文字幕亚洲情99在线 | 丰满少妇人妻久久久久久 | 久久久久亚洲精品男人的天堂 | 一本无码人妻在中文字幕免费 | 人妻夜夜爽天天爽三区 | 欧美人与动性行为视频 | 娇妻被黑人粗大高潮白浆 | 亚洲国产高清在线观看视频 | 亚洲欧美日韩综合久久久 | 欧美自拍另类欧美综合图片区 | 无码中文字幕色专区 | 久久zyz资源站无码中文动漫 | 亚洲成a人一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 装睡被陌生人摸出水好爽 | 欧美高清在线精品一区 | 鲁鲁鲁爽爽爽在线视频观看 | 人妻人人添人妻人人爱 | 99久久久国产精品无码免费 | 午夜福利不卡在线视频 | 国内精品人妻无码久久久影院 | 疯狂三人交性欧美 | 中文字幕av无码一区二区三区电影 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 伊在人天堂亚洲香蕉精品区 | 亚洲精品午夜无码电影网 | 亚洲精品成a人在线观看 | 国产香蕉尹人综合在线观看 | 国产xxx69麻豆国语对白 | 色一情一乱一伦一区二区三欧美 | 国产精品成人av在线观看 | av小次郎收藏 | 久久五月精品中文字幕 | 久久国产精品精品国产色婷婷 | 国产9 9在线 | 中文 | 中文字幕无码人妻少妇免费 | 99麻豆久久久国产精品免费 | 亚洲精品一区二区三区婷婷月 | 伊人久久大香线蕉午夜 | 人妻插b视频一区二区三区 | 76少妇精品导航 | 国产两女互慰高潮视频在线观看 | 日本肉体xxxx裸交 | 动漫av网站免费观看 | 国产精品国产三级国产专播 | 成在人线av无码免费 | 国产一区二区不卡老阿姨 | 午夜福利不卡在线视频 | 国产一区二区三区日韩精品 | 国产艳妇av在线观看果冻传媒 | 综合人妻久久一区二区精品 | 亚洲色www成人永久网址 | 偷窥村妇洗澡毛毛多 | 成 人影片 免费观看 | av人摸人人人澡人人超碰下载 | 无码av岛国片在线播放 | 牲欲强的熟妇农村老妇女 | 精品欧美一区二区三区久久久 | 国产艳妇av在线观看果冻传媒 | 日韩人妻无码中文字幕视频 | 色窝窝无码一区二区三区色欲 | 疯狂三人交性欧美 | 国产精品久久精品三级 | 亚洲爆乳大丰满无码专区 | 俄罗斯老熟妇色xxxx | 久久久中文久久久无码 | 黑人巨大精品欧美一区二区 | 无码人妻出轨黑人中文字幕 | 亚洲欧洲日本无在线码 | 欧美国产日韩久久mv | 97无码免费人妻超级碰碰夜夜 | 日本一区二区三区免费播放 | 东京热无码av男人的天堂 | 日韩精品久久久肉伦网站 | 青草视频在线播放 | 国产在线精品一区二区三区直播 | 波多野结衣av在线观看 | 狂野欧美性猛交免费视频 | 亚洲精品国产精品乱码视色 | 免费国产黄网站在线观看 | 97资源共享在线视频 | 国产农村妇女高潮大叫 | 国产午夜无码视频在线观看 | 牲欲强的熟妇农村老妇女视频 | 久久久久久a亚洲欧洲av冫 | 玩弄少妇高潮ⅹxxxyw | 国产无av码在线观看 | 天堂а√在线地址中文在线 | 乱中年女人伦av三区 | 最新国产麻豆aⅴ精品无码 | 国产人妻大战黑人第1集 | 久久午夜夜伦鲁鲁片无码免费 | 久久久国产精品无码免费专区 | 亚洲七七久久桃花影院 | 久在线观看福利视频 | 无码成人精品区在线观看 | 中文亚洲成a人片在线观看 | 在线成人www免费观看视频 | 精品无码av一区二区三区 | 国产猛烈高潮尖叫视频免费 | 黑人玩弄人妻中文在线 | 成人欧美一区二区三区 | 国产熟女一区二区三区四区五区 | 亚洲日韩av片在线观看 | 久久国产精品_国产精品 | 色综合视频一区二区三区 | 日本饥渴人妻欲求不满 | 国产成人无码av在线影院 | 国产成人午夜福利在线播放 | 国产精品无码一区二区桃花视频 | 中文无码伦av中文字幕 | 无遮挡国产高潮视频免费观看 | 中国女人内谢69xxxxxa片 | 日本护士xxxxhd少妇 | 好爽又高潮了毛片免费下载 | 国产内射爽爽大片视频社区在线 | 人人爽人人爽人人片av亚洲 | 精品国产国产综合精品 | 成 人 网 站国产免费观看 | 少妇性l交大片 | 久久久久久av无码免费看大片 | 性生交片免费无码看人 | 欧美国产日产一区二区 | 亚洲小说春色综合另类 | 99久久精品无码一区二区毛片 | 亚洲中文字幕av在天堂 | 国产成人无码a区在线观看视频app | 麻豆国产97在线 | 欧洲 | 成人免费视频一区二区 | 欧美日韩亚洲国产精品 | 国产香蕉尹人视频在线 | 未满小14洗澡无码视频网站 | 少妇人妻av毛片在线看 | 色欲av亚洲一区无码少妇 | 亚洲成a人片在线观看日本 | 捆绑白丝粉色jk震动捧喷白浆 | 成人无码影片精品久久久 | 亚洲综合另类小说色区 | 综合网日日天干夜夜久久 | 一本久道久久综合婷婷五月 | 国产av一区二区精品久久凹凸 | 十八禁真人啪啪免费网站 | 国产超碰人人爽人人做人人添 | 亚洲色偷偷男人的天堂 | 少妇性俱乐部纵欲狂欢电影 | 久久99精品久久久久久动态图 | 天天做天天爱天天爽综合网 | 玩弄少妇高潮ⅹxxxyw | 国产亚洲欧美日韩亚洲中文色 | 人人妻人人澡人人爽人人精品浪潮 |