1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringBoot RESTful實戰(zhàn)

        共 13768字,需瀏覽 28分鐘

         ·

        2020-01-04 23:21


        本文公眾號來源:美碼師作者:美碼師本文已收錄至我的GitHub

        一、目標(biāo)

        1. 了解 Restful 是什么,基本概念及風(fēng)格;

        2. 能使用SpringBoot 實現(xiàn)一套基礎(chǔ)的 Restful 風(fēng)格接口;

        3. 利用Swagger 生成清晰的接口文檔。

        二、Restful 入門

        什么是REST?

        摘自百科的定義:REST即表述性狀態(tài)轉(zhuǎn)移(英文:Representational State Transfer,簡稱REST) 是Roy Fielding博士(HTTP規(guī)范主要貢獻(xiàn)者)在2000年的論文中提出來的一種軟件架構(gòu)風(fēng)格。 是一種針對網(wǎng)絡(luò)應(yīng)用的設(shè)計和開發(fā)方式,可以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。

        通俗點(diǎn)說,REST就是一組架構(gòu)約束準(zhǔn)則;在這些準(zhǔn)則中,有不少是利用了現(xiàn)有的WEB標(biāo)準(zhǔn)能力。 而最終的目的則是簡化當(dāng)前業(yè)務(wù)層的設(shè)計及開發(fā)工作。

        Restful API 則是指符合REST架構(gòu)約束的API,關(guān)于這個詞在早年前其實已經(jīng)非常流行,但大多數(shù)開發(fā)者對其仍然 處于觀望狀態(tài),并不一定會立即采用。這個相信與當(dāng)時技術(shù)社區(qū)的成熟度及氛圍是密切相關(guān)。 無論如何,在微服務(wù)架構(gòu)如此流行的今天,Restful API已經(jīng)成為了一種必備的的標(biāo)準(zhǔn)設(shè)計風(fēng)格。


        關(guān)鍵要點(diǎn)

        理解 Restful 風(fēng)格需要理解以下幾點(diǎn):

        • 資源

        資源指的就是一個抽象的信息實體,可以是一個用戶、一首歌曲、一篇文章,只要是可作為引用的對象就是資源。 每個資源通常會被映射到一個URI,通過訪問這個URI可以獲取到信息。

        • 資源的表述

        資源表述(Representation)指的則是資源的外在表現(xiàn)形式 比如一個帖子,可以通過HTML格式展現(xiàn),也可以通過XML、JSON等格式輸出到客戶端。

        在前面的文章(SpringBoot-Scope詳解)中提到,HTTP協(xié)議通過MIME來統(tǒng)一定義數(shù)據(jù)信息的格式標(biāo)準(zhǔn)。 通常,Accept、Content-Type可以用來指定客戶端及服務(wù)端可接受的信息格式,而這個就是資源的表述

        • 狀態(tài)轉(zhuǎn)移

        在HTTP訪問過程中,資源的狀態(tài)發(fā)生變化。這里會涉及到以下的幾個動詞:

        名稱語義
        GET獲取資源
        POST新建資源
        PUT更新資源
        DELETE刪除資源

        對于不同的訪問方法,服務(wù)器會產(chǎn)生對應(yīng)的行為并促使資源狀態(tài)產(chǎn)生轉(zhuǎn)換。

        關(guān)于無狀態(tài)

        Restful 是無狀態(tài)的設(shè)計,這點(diǎn)意味著交互過程中的請求應(yīng)該能包含所有需要的信息,而不需要依賴于已有的上下文。 然而 JavaEE中存在一些違背的做法,比如Cookie中設(shè)置JSESSIONID, 在多次請求間傳遞該值作為會話唯一標(biāo)識,這標(biāo)識著服務(wù)端必須保存著這些會話狀態(tài)數(shù)據(jù)。

        PlayFramework框架實現(xiàn)了無狀態(tài)的Session,其將會話數(shù)據(jù)經(jīng)過加密編碼并置入Cookie中, 這樣客戶端的請求將直接攜帶上全部的信息,是無狀態(tài)的請求**,這點(diǎn)非常有利于服務(wù)端的可擴(kuò)展性。


        三、SpringBoot 實現(xiàn) Restful

        接下來,我們利用 SpringBoot 來實現(xiàn)一個Restful 風(fēng)格的樣例。

        說明基于 PetStore(寵物店) 的案例,實現(xiàn)對某顧客(Customer)名下的寵物(Pet)的增刪改查。

        1. 實體定義

        Customer

        1. publicclassCustomer{

        2. ? ?privateString name;

        3. ? ?publicCustomer(){

        4. ? ? ? ?super();

        5. ? ?}

        6. ? ?publicCustomer(String name){

        7. ? ? ? ?super();

        8. ? ? ? ?this.name = name;

        9. ? ?}

        10. ? ?publicString getName(){

        11. ? ? ? ?return name;

        12. ? ?}

        13. ? ?publicvoid setName(String name){

        14. ? ? ? ?this.name = name;

        15. ? ?}

        16. }

        Customer 只包含一個name屬性,我們假定這是唯一的標(biāo)志。

        Pet

        1. publicclassPet{

        2. ? ?privateString petId;

        3. ? ?privateString name;

        4. ? ?privateString type;

        5. ? ?privateString description;

        6. ? ?publicString getPetId(){

        7. ? ? ? ?return petId;

        8. ? ?}

        9. ? ?publicvoid setPetId(String petId){

        10. ? ? ? ?this.petId = petId;

        11. ? ?}

        12. ? ?publicString getName(){

        13. ? ? ? ?return name;

        14. ? ?}

        15. ? ?publicvoid setName(String name){

        16. ? ? ? ?this.name = name;

        17. ? ?}

        18. ? ?publicString getType(){

        19. ? ? ? ?return type;

        20. ? ?}

        21. ? ?publicvoid setType(String type){

        22. ? ? ? ?this.type = type;

        23. ? ?}

        24. ? ?publicString getDescription(){

        25. ? ? ? ?return description;

        26. ? ?}

        27. ? ?publicvoid setDescription(String description){

        28. ? ? ? ?this.description = description;

        29. ? ?}

        30. }

        Pet 包含了以下幾個屬性

        屬性名描述
        petId寵物ID編號
        name寵物名稱
        type寵物類型
        description寵物的描述

        2. URL資源

        基于Restful 的原則,我們定義了以下的一組URL:

        接口方法URL
        添加寵物POST/rest/pets/{customer}
        獲取寵物列表GET/rest/pets/{customer}
        獲取寵物信息GET/rest/pets/{customer}/{petId}
        更新寵物信息PUT/rest/pets/{customer}/{petId}
        刪除寵物DELETE/rest/pets/{customer}/{petId}

        3. 數(shù)據(jù)管理

        接下來實現(xiàn)一個PetManager 類,用于模擬在內(nèi)存中對Pet數(shù)據(jù)進(jìn)行增刪改查 代碼如下:

        1. @Component

        2. publicclassPetManager{

        3. ? ?privatestaticMap<String,Customer> customers =newConcurrentHashMap<String,Customer>();

        4. ? ?privatestaticMap<String,Map<String,Pet>> pets =newConcurrentHashMap<String,Map<String,Pet>>();

        5. ? ?@PostConstruct

        6. ? ?publicvoid init(){

        7. ? ? ? ?String[] customerNames =newString[]{"Lilei","Hanmeimei","Jim Green"};

        8. ? ? ? ?for(String customerName : customerNames){

        9. ? ? ? ? ? ?customers.put(customerName,newCustomer(customerName));

        10. ? ? ? ?}

        11. ? ?}

        12. ? ?/**

        13. ? ? * 獲取customer

        14. ? ? *

        15. ? ? * @param customer

        16. ? ? * @return

        17. ? ? */

        18. ? ?publicCustomer getCustomer(String customer){

        19. ? ? ? ?if(StringUtils.isEmpty(customer)){

        20. ? ? ? ? ? ?returnnull;

        21. ? ? ? ?}

        22. ? ? ? ?return customers.get(customer);

        23. ? ?}

        24. ? ?/**

        25. ? ? * 獲取customer名下的 pet 列表

        26. ? ? *

        27. ? ? * @param customer

        28. ? ? * @return

        29. ? ? */

        30. ? ?publicList<Pet> getPets(String customer){

        31. ? ? ? ?if(StringUtils.isEmpty(customer)){

        32. ? ? ? ? ? ?returnCollections.emptyList();

        33. ? ? ? ?}

        34. ? ? ? ?if(!pets.containsKey(customer)){

        35. ? ? ? ? ? ?returnCollections.emptyList();

        36. ? ? ? ?}

        37. ? ? ? ?return pets.get(customer).values().stream().collect(Collectors.toList());

        38. ? ?}

        39. ? ?/**

        40. ? ? * 獲取某個pet

        41. ? ? *

        42. ? ? * @param customer

        43. ? ? * @param petId

        44. ? ? * @return

        45. ? ? */

        46. ? ?publicPet getPet(String customer,String petId){

        47. ? ? ? ?if(StringUtils.isEmpty(customer)||StringUtils.isEmpty(petId)){

        48. ? ? ? ? ? ?returnnull;

        49. ? ? ? ?}

        50. ? ? ? ?if(!pets.containsKey(customer)){

        51. ? ? ? ? ? ?returnnull;

        52. ? ? ? ?}

        53. ? ? ? ?return pets.get(customer).get(petId);

        54. ? ?}

        55. ? ?/**

        56. ? ? * 刪除pet

        57. ? ? *

        58. ? ? * @param customer

        59. ? ? * @param petId

        60. ? ? * @return

        61. ? ? */

        62. ? ?publicboolean removePet(String customer,String petId){

        63. ? ? ? ?if(StringUtils.isEmpty(customer)||StringUtils.isEmpty(petId)){

        64. ? ? ? ? ? ?returnfalse;

        65. ? ? ? ?}

        66. ? ? ? ?if(!pets.containsKey(customer)){

        67. ? ? ? ? ? ?returnfalse;

        68. ? ? ? ?}

        69. ? ? ? ?return pets.get(customer).remove(petId)!=null;

        70. ? ?}

        71. ? ?/**

        72. ? ? * 添加pet

        73. ? ? *

        74. ? ? * @param customer

        75. ? ? * @param pet

        76. ? ? * @return

        77. ? ? */

        78. ? ?publicPet addPet(String customer,Pet pet){

        79. ? ? ? ?if(StringUtils.isEmpty(customer)|| pet ==null){

        80. ? ? ? ? ? ?returnnull;

        81. ? ? ? ?}

        82. ? ? ? ?Map<String,Pet> customerPets =null;

        83. ? ? ? ?if(!pets.containsKey(customer)){

        84. ? ? ? ? ? ?customerPets =newLinkedHashMap<String,Pet>();

        85. ? ? ? ? ? ?Map<String,Pet> previous = pets.putIfAbsent(customer, customerPets);

        86. ? ? ? ? ? ?// 已經(jīng)存在

        87. ? ? ? ? ? ?if(previous !=null){

        88. ? ? ? ? ? ? ? ?customerPets = previous;

        89. ? ? ? ? ? ?}

        90. ? ? ? ?}else{

        91. ? ? ? ? ? ?customerPets = pets.get(customer);

        92. ? ? ? ?}

        93. ? ? ? ?if(pet.getPetId()==null){

        94. ? ? ? ? ? ?pet.setPetId(UUID.randomUUID().toString());

        95. ? ? ? ?}

        96. ? ? ? ?customerPets.put(pet.getPetId(), pet);

        97. ? ? ? ?return pet;

        98. ? ?}

        99. ? ?/**

        100. ? ? * 更新某個pet

        101. ? ? *

        102. ? ? * @param customer

        103. ? ? * @param petPojo

        104. ? ? * @return

        105. ? ? */

        106. ? ?publicPet updatePet(String customer,Pet petPojo){

        107. ? ? ? ?if(StringUtils.isEmpty(customer)|| petPojo ==null){

        108. ? ? ? ? ? ?returnnull;

        109. ? ? ? ?}

        110. ? ? ? ?if(petPojo.getPetId()==null){

        111. ? ? ? ? ? ?returnnull;

        112. ? ? ? ?}

        113. ? ? ? ?Pet pet = getPet(customer, petPojo.getPetId());

        114. ? ? ? ?pet.setType(petPojo.getType());

        115. ? ? ? ?pet.setName(petPojo.getName());

        116. ? ? ? ?pet.setDescription(petPojo.getDescription());

        117. ? ? ? ?return pet;

        118. ? ?}

        119. }


        4. 控制層實現(xiàn)

        SpringBoot 提供了 @RestController,用于快速定義一個Restful 風(fēng)格的Controller類@RestController=@ResponseBody + @Controller

        1. @RestController

        2. @RequestMapping("/rest/pets/{customer}")

        3. publicclassRestApiController{

        4. ? ?@Autowired

        5. ? ?privatePetManager dataManager;

        6. ? ?/**

        7. ? ? * 添加寵物

        8. ? ? *

        9. ? ? * @param customer

        10. ? ? * @param pet

        11. ? ? * @return

        12. ? ? */

        13. ? ?@PostMapping

        14. ? ?publicResponseEntity<Object> addPet(@PathVariableString customer,@RequestBodyPet pet){

        15. ? ? ? ?validateCustomer(customer);

        16. ? ? ? ?Pet newPet = dataManager.addPet(customer, pet);

        17. ? ? ? ?// 返回 201.created

        18. ? ? ? ?if(newPet !=null){

        19. ? ? ? ? ? ?URI location =ServletUriComponentsBuilder.fromCurrentRequest().path("/{petId}")

        20. ? ? ? ? ? ? ? ? ? ?.buildAndExpand(newPet.getPetId()).toUri();

        21. ? ? ? ? ? ?returnResponseEntity.created(location).build();

        22. ? ? ? ?}

        23. ? ? ? ?// 返回 204.noContent

        24. ? ? ? ?returnResponseEntity.noContent().build();

        25. ? ?}

        26. ? ?/**

        27. ? ? * 獲取寵物列表

        28. ? ? *

        29. ? ? * @param customer

        30. ? ? * @return

        31. ? ? */

        32. ? ?@GetMapping

        33. ? ?@ResponseBody

        34. ? ?publicList<Pet> listPets(@PathVariableString customer){

        35. ? ? ? ?validateCustomer(customer);

        36. ? ? ? ?List<Pet> pets = dataManager.getPets(customer);

        37. ? ? ? ?return pets;

        38. ? ?}

        39. ? ?/**

        40. ? ? * 獲取某個寵物

        41. ? ? *

        42. ? ? * @param customer

        43. ? ? * @param petId

        44. ? ? */

        45. ? ?@GetMapping("/{petId}")

        46. ? ?@ResponseBody

        47. ? ?publicPet getPet(@PathVariableString customer,@PathVariableString petId){

        48. ? ? ? ?validateCustomer(customer);

        49. ? ? ? ?validatePet(customer, petId);

        50. ? ? ? ?Pet pet = dataManager.getPet(customer, petId);

        51. ? ? ? ?return pet;

        52. ? ?}

        53. ? ?/**

        54. ? ? * 更新寵物信息

        55. ? ? *

        56. ? ? * @param customer

        57. ? ? * @param petId

        58. ? ? * @param pet

        59. ? ? */

        60. ? ?@PutMapping("/{petId}")

        61. ? ?publicResponseEntity<Object> updatePet(@PathVariableString customer,@PathVariableString petId,@RequestBodyPet pet){

        62. ? ? ? ?validateCustomer(customer);

        63. ? ? ? ?validatePet(customer, petId);

        64. ? ? ? ?pet.setPetId(petId);

        65. ? ? ? ?Pet petObject = dataManager.updatePet(customer, pet);

        66. ? ? ? ?if(petObject !=null){

        67. ? ? ? ? ? ?returnResponseEntity.ok(petObject);

        68. ? ? ? ?}

        69. ? ? ? ?returnResponseEntity.noContent().build();

        70. ? ?}

        71. ? ?/**

        72. ? ? * 刪除某個寵物

        73. ? ? *

        74. ? ? * @param customer

        75. ? ? * @param petId

        76. ? ? * @return

        77. ? ? */

        78. ? ?@DeleteMapping("/{petId}")

        79. ? ?publicResponseEntity<Object> removePet(@PathVariableString customer,@PathVariableString petId){

        80. ? ? ? ?validateCustomer(customer);

        81. ? ? ? ?validatePet(customer, petId);

        82. ? ? ? ?dataManager.removePet(customer, petId);

        83. ? ? ? ?returnResponseEntity.ok().build();

        84. ? ?}

        上述代碼中已經(jīng)實現(xiàn)了完整的增刪改查語義。 在Restful 風(fēng)格的API 接口定義中,往往會引用 HTTP 狀態(tài)碼用于表示不同的結(jié)果,比如一些錯誤的狀態(tài)類型。

        這里我們對Customer、Pet 進(jìn)行存在性校驗,若資源不存在返回404_NotFound。

        1. ? ?/**

        2. ? ? * 校驗customer是否存在

        3. ? ? *

        4. ? ? * @param customer

        5. ? ? */

        6. ? ?privatevoid validateCustomer(String customer){

        7. ? ? ? ?if(dataManager.getCustomer(customer)==null){

        8. ? ? ? ? ? ?thrownewObjectNotFoundException(String.format("the customer['%s'] is not found", customer));

        9. ? ? ? ?}

        10. ? ?}

        11. ? ?/**

        12. ? ? * 校驗pet是否存在

        13. ? ? *

        14. ? ? * @param customer

        15. ? ? */

        16. ? ?privatevoid validatePet(String customer,String petId){

        17. ? ? ? ?if(dataManager.getPet(customer, petId)==null){

        18. ? ? ? ? ? ?thrownewObjectNotFoundException(String.format("the pet['%s/%s'] is not found", customer, petId));

        19. ? ? ? ?}

        20. ? ?}

        自定義異常攔截

        1. ? ?/**

        2. ? ? * 自定義異常,及攔截邏輯

        3. ? ? *

        4. ? ? * @author atp

        5. ? ? *

        6. ? ? */

        7. ? ?@SuppressWarnings("serial")

        8. ? ?publicstaticclassObjectNotFoundExceptionextendsRuntimeException{

        9. ? ? ? ?publicObjectNotFoundException(String msg){

        10. ? ? ? ? ? ?super(msg);

        11. ? ? ? ?}

        12. ? ?}

        13. ? ?@ResponseBody

        14. ? ?@ExceptionHandler(ObjectNotFoundException.class)

        15. ? ?@ResponseStatus(HttpStatus.NOT_FOUND)

        16. ? ?publicString objectNotFoundExceptionHandler(ObjectNotFoundException ex){

        17. ? ? ? ?return ex.getMessage();

        18. ? ?}


        5. 接口驗證

        1. 添加寵物

        URLPOST http://{{server}}/rest/pets/LiLei請求內(nèi)容

        1. {

        2. "name":"Smart Baby",

        3. "description":"very small and smart also.",

        4. "type":"Dog"

        5. }

        返回示例

        1. 201 created

        2. Content-Length0

        3. DateMon,09Jul201805:15:01 GMT

        4. Locationhttp://localhost:8090/rest/pets/LiLei/b5400334-e7b3-42f1-b192-f5e7c3193543

        2. 獲取寵物列表

        URLGET http://{{server}}/rest/pets/LiLei請求內(nèi)容

        返回示例

        1. 200 OK

        2. Content-Typeapplication/json;charset=UTF-8

        3. DateMon,09Jul201805:23:27 GMT

        4. Transfer-Encodingchunked

        5. [

        6. ? ?{

        7. ? ? ? ?"petId":"b5400334-e7b3-42f1-b192-f5e7c3193543",

        8. ? ? ? ?"name":"Smart Baby",

        9. ? ? ? ?"type":"Dog",

        10. ? ? ? ?"description":"very small and smart also."

        11. ? ?},

        12. ? ?{

        13. ? ? ? ?"petId":"610780af-94f1-4011-a175-7a0f3895163d",

        14. ? ? ? ?"name":"Big Cat",

        15. ? ? ? ?"type":"Cat",

        16. ? ? ? ?"description":"very old but I like it."

        17. ? ?}

        18. ]

        3. 查詢寵物信息

        URLGET http://{{server}}/rest/pets/LiLei/b5400334-e7b3-42f1-b192-f5e7c3193543請求內(nèi)容

        返回示例

        1. 200 OK

        2. Content-Typeapplication/json;charset=UTF-8

        3. DateMon,09Jul201805:25:24 GMT

        4. Transfer-Encodingchunked

        5. {

        6. ? ?"petId":"b5400334-e7b3-42f1-b192-f5e7c3193543",

        7. ? ?"name":"Smart Baby",

        8. ? ?"type":"Dog",

        9. ? ?"description":"very small and smart also."

        10. }

        4. 更新寵物信息

        URLPUT http://{{server}}/rest/pets/LiLei/b5400334-e7b3-42f1-b192-f5e7c3193543請求內(nèi)容

        1. {

        2. "name":"Big Cat V2",

        3. "description":"I don't like it any more",

        4. "type":"Cat"

        5. }

        返回示例

        1. 200 OK

        2. Content-Typeapplication/json;charset=UTF-8

        3. DateMon,09Jul201805:31:28 GMT

        4. Transfer-Encodingchunked

        5. {

        6. ? ?"petId":"a98e4478-e754-4969-851b-bcaccd67263e",

        7. ? ?"name":"Big Cat V2",

        8. ? ?"type":"Cat",

        9. ? ?"description":"I don't like it any more"

        10. }

        5. 刪除寵物

        URLDELETE http://{{server}}/rest/pets/LiLei/b5400334-e7b3-42f1-b192-f5e7c3193543請求內(nèi)容

        返回示例

        1. 200 OK

        2. Content-Length0

        3. DateMon,09Jul201805:32:51 GMT

        相關(guān)出錯

        • 客戶不存在:404 the customer['test'] is not found

        • 寵物不存在:404 the pet['LiLei/b5400334-e7b3-42f1-b192-f5e7c31935431'] is not found

        四、Swagger 的使用

        關(guān)于Swagger

        Swagger是目前非常流行的一個API設(shè)計開發(fā)框架(基于OpenApi), 可用于API的設(shè)計、管理、代碼生成以及Mock測試等。

        目前Swagger的應(yīng)用非常廣,其涵蓋的開源模塊也比較多,這里將使用swagger-ui實現(xiàn)API在線DOC的生成。

        引入依賴

        1. ? ? ? ?

        2. ? ? ? ? ? ?io.springfox

        3. ? ? ? ? ? ?springfox-swagger2

        4. ? ? ? ? ? ?2.7.0

        5. ? ? ? ?

        6. ? ? ? ?

        7. ? ? ? ? ? ?io.springfox

        8. ? ? ? ? ? ?springfox-swagger-ui

        9. ? ? ? ? ? ?2.7.0

        10. ? ? ? ?

        定義API配置

        1. @EnableSwagger2

        2. @Configuration

        3. publicclassSwaggerConfig{

        4. ? ?publicstaticfinalString VERSION ="1.0.0";

        5. ? ?@Value("${swagger.enable}")

        6. ? ?privateboolean enabled;

        7. ? ?ApiInfo apiInfo(){

        8. ? ? ? ?returnnewApiInfoBuilder().

        9. ? ? ? ? ? ? ? ?title("Pet Api Definition")

        10. ? ? ? ? ? ? ? ?.description("The Petstore CRUD Example")

        11. ? ? ? ? ? ? ? ?.license("Apache 2.0")

        12. ? ? ? ? ? ? ? ?.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")

        13. ? ? ? ? ? ? ? ?.termsOfServiceUrl("")

        14. ? ? ? ? ? ? ? ?.version(VERSION)

        15. ? ? ? ? ? ? ? ?.contact(newContact("","","[email protected]"))

        16. ? ? ? ? ? ? ? ?.build();

        17. ? ?}

        18. ? ?@Bean

        19. ? ?publicDocket customImplementation(){

        20. ? ? ? ?returnnewDocket(DocumentationType.SWAGGER_2).select()

        21. ? ? ? ? ? ? ? ?.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))

        22. ? ? ? ? ? ? ? ?.build()

        23. ? ? ? ? ? ? ? ?.enable(enabled)

        24. ? ? ? ? ? ? ? ?.apiInfo(apiInfo());

        25. ? ?}

        26. }

        @EnableSwagger2聲明了Swagger的啟用,Docket的Bean定義是API配置的入口, 可以設(shè)置API名稱、版本號,掃描范圍等。

        聲明API描述

        在原有的Controller 方法上添加關(guān)于API的聲明,如下:

        1. @Api(value ="Pet Restful api")

        2. @RestController

        3. @RequestMapping("/rest/pets/{customer}")

        4. publicclassRestApiController{

        5. ? ?@ApiOperation("添加寵物")

        6. ? ?@ApiImplicitParams({

        7. ? ? ? ? ? ?@ApiImplicitParam(paramType ="path", name ="customer", dataType ="String", required =true, value ="客戶名", defaultValue =""),

        8. ? ? ? ? ? ?@ApiImplicitParam(paramType ="body", name ="pet", dataType ="Pet", required =true, value ="pet 請求", defaultValue ="")})

        9. ? ?@ApiResponses({

        10. ? ? ? ?@ApiResponse(code =201, message ="添加成功"),

        11. ? ? ? ?@ApiResponse(code =404, message ="資源不存在")

        12. ? ?})

        13. ? ?@PostMapping

        14. ? ?publicResponseEntity<Object> addPet(@PathVariableString customer,@RequestBodyPet pet){

        15. ? ? ? ?...

        為了能描述返回對象的文檔說明,為Pet類做API聲明:

        1. @ApiModel("寵物信息")

        2. publicclassPet{

        3. ? ?@ApiModelProperty(name="petId", value="寵物ID")

        4. ? ?privateString petId;

        5. ? ?@ApiModelProperty(name="name", value="寵物名稱")

        6. ? ?privateString name;

        7. ? ?@ApiModelProperty(name="type", value="寵物類型")

        8. ? ?privateString type;

        9. ? ?@ApiModelProperty(name="description", value="寵物描述")

        10. ? ?privateString description;

        相關(guān)的注解:

        注解描述
        @ApiModelProperty用在出入?yún)?shù)對象的字段上
        @Api用于controller類
        @ApiOperation用于controller方法,描述操作
        @ApiResponses用于controller方法,描述響應(yīng)
        @ApiResponse用于@ApiResponses內(nèi),描述單個響應(yīng)結(jié)果
        @ApiImplicitParams用于controller的方法,描述入?yún)?/td>
        @ApiImplicitParam用于@ApiImplicitParams內(nèi),描述單個入?yún)?/td>
        @ApiModel用于返回對象類

        訪問文檔

        最后,訪問 http://localhost:8000/swagger_ui.html,可看到生成的文檔界面:

        bf991dc04c675e6bc7f2b59a25d408b5.webp


        歡迎加入交流群學(xué)習(xí),備注加群說實話在這個群,哪怕您不說話,光看聊天記錄,都能學(xué)到東西




        兩年嘔心瀝血的文章「面試題」「基礎(chǔ)」「進(jìn)階」這里全都有!

        300多篇原創(chuàng)技術(shù)文章加入交流群學(xué)習(xí)海量視頻資源精美腦圖面試題

        長按掃碼可關(guān)注獲取?

        在看和分享對我非常重要!a2749161df7dffaa68a479835e46a51d.webp

        瀏覽 62
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性爱日韩| 色香蕉在线视频| 91成人大片| 日本色综合| 黄色片一级片| 先锋影音资源网站| 麻豆精东一区二区欧美国产 | 亚洲欧美国产另类| 午夜69成人做爱视频网站| 日韩特黄| 操操操操| 久久99久久99久久99人受| 欧美男女日逼视频| 亚洲第一无码| 国产精品成人AV在线| 欧美日韩一级黄色片| 久久精品国产精品| 久九视频| 91超碰大香蕉| 免费无码高清| 天堂资源站| 日韩欧美中文在线| 久久福利网| 久久久一| 精品一区二区三区蜜桃臀www| 精品码产区一区二亚洲国产| 尤物视频网址| 成年女人毛片| 免费无码一区二区三区| 三级片男人天堂| 天天肏天天干| 伊人精品大香蕉| 这里只有精品在线观看| 一级黄色蜜芽视频| 亚洲欧美卡通| 大香蕉av一区二区三区在线观看| 操逼逼网站| 日韩国产在线观看| 人人操人人摸人人爽| 99久久久| 中文字幕乱码无码人妻系列蜜桃| 青青久草| 久久免费播放视频| 狠狠肏| 亚洲午夜无码久久久| 五月激情丁香| 国产大屌| 亚洲国产91| 夜夜骑夜夜撸| 日本精品人妻无码77777| 国产青草| 精品久久国产| 成人爱爱免费视频| 婷婷开心色四房播播在线| 潮喷在线观看| 毛片自拍| 日韩中文字幕免费| 免费观看日韩无码视频| 久草视频观看| 中文字幕高清在线中文字幕中文字幕| 国产一区二区三区在线观看免费视频免费视频免费视频 | 国产精品H| 亚洲图片一区| 69成人国产| 国产激情在线播放| 欧美色图狠狠操| 亚洲AV观看| 久久久久亚洲AV无码专区成人| 婷婷五月精品中文字幕| 天堂网2025| 亚洲无码电影在线| 亚洲国产电影| 老女人操逼网| 国产午夜精品电影| 99热一区二区三区| 国产免费A片| 欧美一级欧美三级在线观看| 天天躁狠狠躁av| 强开小嫩苞一区二区电影| 国产女人18| 黄片免费观看视频| 亚洲日韩欧美一厂二区入| 肉片无遮挡一区二区三区免费观看视频 | 国产三级91| 99久久精品国产成人一区二区 | 99久久成人| 日韩乱伦小说| 欧亚AV| 在线操B视频| 日韩成人一区二区三区| 91爱爱爱爱| 久草资源| 国产精品无码av| 国产麻豆免费| 久久精品6| 欧美性爱怡红院| 岛国av无码免费| 免费A片国产毛无码A片| 日本a在线免费观看| 欧美日韩A片欧美日| 免费看黄片,在线观看| 你懂得在线视频| 亚洲天堂无码a| 91日日夜夜| 天天干天天在线观看| 久久成人三级片| 婷婷二区| 久久丁香| 丁香五月天在线| av免费观看网址| 波多野结衣无码高清| 久久精品91| 伊人久久大香蕉国产| 男女爱爱动态图| 日韩一级无码特黄AAA片| 亚洲午夜激情电影| 天堂精品在线| 先锋成人资源| AV天天干| 少妇搡BBBB搡BBB搡造水多,| 大乳奶一级婬片A片| 超碰A片| 国产亚洲精品午夜福利巨大软件| 久久Av电影| 中文字幕乱视频| 99久久久精品| 无码国产99精品久久久久网站| 欧美激情网站| 伊人久色| 日韩欧美在线不卡| 思思热免费视频| 中文免费高清在线观看视频| 日韩精品网| 欧美三级片网| AV电影一区| 亚洲伊人av| 亚洲精品偷拍| 久久亚洲免费视频| 蜜臀网| 黄色一级片免费在线观看| 午夜黄色| 日韩精品一二三区| 日韩综合在线视频| 麻豆91蜜桃传媒在线观看| 日本黄A级A片国产免费| 国产性爱在线| 午夜无码精品一区二区三区99午 | 日本一区二区三区在线视频| 国产视频第一页| 日本老女人视频| 怡红院爽妇网| 韩国精品久久久| 久久精品成人电影| 爱操逼网| 蜜桃性爱视频| 91精品婷婷国产综合| 国产高清精品在线| 黑人内射人妖| 五月天激情婷婷| 92丨九色丨偷拍老熟女| 欧美三级片网| 黄色A片免费视频| 青青日逼| 久久综合成人| 亚洲美女喷水视频| 亚洲无码激情| 亚洲中文字幕在线免费观看视频| 日韩一区在线视频| 亚洲精品suv视频| 91久久婷婷亚洲精品成人| 人妖和人妖互交性XXXX视频| 精品国产一区二区三区性色AV| 91视频观看| 在线看v| 免费操逼视频在线观看| 美女极度色诱图片www视频| 大香蕉综合在线观看| 亚洲激情欧美激情| 尤物综合网| 国产18欠欠欠一区二区| 亚洲欧美色图| 人人爱人人草| 搡BBBB搡BBB搡我瞎了| 青青自拍视频| 精品国产黄色| 做爰视频毛片下载蜜桃视频。| 内射老太太| 黄色视频免费网站| www.俺去啦| 大香蕉电影网站| 亚洲成人自拍无码| 最新日韩在线| 特黄AAAAAAAA片视频| 欧美,日韩,日| 九一精品| 爱搞搞就要搞| 人妻少妇精品视频| 精品二区| 国产精品无码永久免费不卡| 欧美亚洲成人在线| 91小仙女jK白丝袜呻吟| 中文日韩欧美| 五月婷在线| 国产成人AV在线播放| 97超碰资源| 免费看18禁| 亚洲AV无码成人| 日本五十路熟女视频| 午夜福利影视| 97免费| 一级黄色视频免费看| 精品久久一区| 囯产精品久久久久久久| 国产精品香蕉| 高清无码自拍| 亚洲AV毛片| 17c.白丝喷水自慰| 国产一级AA大片毛片| 日韩aaaa| 久久三级片电影| 五月丁香婷婷开心| 人人妻人人澡人人DⅤD| 天堂网中文字幕| 一边做一边说国语对白| 国产精品九九九九九九| 亚洲AV无码国产精品久久不卡| 久久久国产一区| 羞羞午夜| 成人无码日韩精品| 超碰人人在线观看| 制服丝袜大香蕉| 一本色道久久综合无码人妻| 免费的A片| 国产成人a亚洲精品| 久久成人综合| 九九热精品视频在线观看| 黄色一级免费| 黄色二区| 少妇熟女网| 成人777| 亚洲成人av| 91双飞会所双飞在线| 日色色色| 91网站观看| 波多野结衣在线精品| 996re| 亚洲在线网站| caopro| 色婷婷一区二区| 国产精品久久久久野外| 波多野结衣久久| 在线中文字幕在线观看| 中字幕视频在线永久在线观看免费| 高清无码高潮| 玖玖综合网| 成人爽爽视频| 丰满岳乱妇一区二区三区| 日韩综合久久| 国产77777| 国产成人宗合| 国产在线观看mv免费全集电视剧大全 | 欧美BBWBBWBBWBBWBBwBBW | 国产av影院| 一级黄色大毛片| 一区二区三区小视频| 日韩精品中文字幕在线观看| 免费国产三级片| 一本一道伊人99久久综| 欧美一级婬片免费视频黄| 免费中文字幕日韩欧美| 免费的一级A片| 亚洲一区高清无码| 山西真实国产乱子伦| 日本親子亂子倫XXXX50路| 日韩久久精品| 成人夜间视频| 伊人久久大香蕉国产| 欧洲AV在线| jk在线观看| 91视频一区二区| 久久久久久久久久久久久自慰小片 | 欧美日韩A片| 天天操人人妻| 日韩三级黄色| 日韩乱伦中文字幕| 日逼免费网站| 四虎最新视频| 亚洲xxxxxx| 91丨PORNY丨对白| 黄色一级a片| 黄色视频免费在线观看| 蜜桃视频成人版网站| 国产乱论视频| 亚洲黄色免费观看| 亚洲精品国产成人综合久久久久久久久| 日本久久网| 91麻豆精品91久久久久同性| AV黑人| 先锋成人AV| 啪啪免费视频| 日本中文字幕乱伦| 无码电影免费观看| 美日韩中文字幕| 性欧美亚洲| 免费观看黄色在线视频| sm在线观看| 久久无码一区| 超碰护士| 精品无码一区二区三区蜜桃李宗瑞| 日韩欧美一| 国产视频久久| 无码不卡在线播放| 亚洲欧洲综合| 91网站18| 2026AV天堂网| 91在线无码精品秘国产| 性色网站| 啪啪网站免费看| 日韩毛片在线播放| 一区二区三区四区在线| 三区在线观看| 99视频在线看| 日本操逼视频| 国产精品在线免费观看| 欧美污网站| 影音av| 精品多人P群无码视频| 中文字幕国产AV| 欧美成人网站在线观看| 欧美一级性爱在线观看| 久久精品99久久久久久| 亚洲AV免费| 超碰人人爱人人操| 超碰在线国产| 日韩在线欧美在线| 99国产在线观看免费视频| 91av| 伦理无码| 黄色A片一级| 性99网站| 蜜臀av在线免费观看| 亚洲综合久| 欧美一级特黄A片免费看视频小说| VA电影| gogogo日本免费观看高清电视剧的注意 | 91精品人妻一区二| 无码不卡视频在线| 天天视频国产| 欧美黄色一级| 亚洲AV成人电影| 亚洲一区在线播放| 婷婷少妇激情| 无码狠狠躁久久久久久久91| 一级二级无码| 午夜福利爱爱视频| 中文字幕成人| 你懂的视频在线播放| 天天天天天天干| AV牛牛| 在线看v| 福利视频导航自拍| av无码电影| 青青草大香蕉在线| 亚洲春色一区二区三区| 日韩乱伦毛片| 国产精品高潮无套内谢| 国产精品18进进出出17c| 国产在线观看91| 丁香六月婷婷综合| 国产伊人网| 99久久九九| 91精品久久久久久久久久久久| 国产福利网站| 高清日韩欧美| 亚洲91在线| 草草影院第一页YYCCC| 91国产爽黄在线| 免费看污网站| 亚洲精品一区二三区不卡| 玖玖色资源| 专区无日本视频高清8| 欧美试看| 日本一区二区不卡| 国产成人亚洲精品| 日韩在线小视频| 波多野结衣在线观看一区二区| 色猫AV| 亚洲伊人大香蕉| 男女日逼| 亚洲人成小说| 汇聚全球淫荡熟女| 亚洲涩情91日韩一区二区| 91丨PORNY丨在线中文| 囯产精品久久久久久久| 国产精品色色色| 91免费视频观看| 欧美成人免费观看| 丰滿老婦BBwBBwBBw| 性欧美欧美巨大69| 国产无码av| 日韩操逼电影| 插菊花综合网亚洲| 三级片网站大全| 欧美中文网| 国产一区二区av| 一区二区三区精品无码| 日都一级A片| 囯产精品久久久久久久| 久久久午夜| 大香蕉精品视频在线| 超碰极品| 美日韩在线观看| 色五月中文字幕| 国产又粗又大又爽| 激情一区二区| 欧美A片在线播放| 日韩中文久久| 午夜成人毛片| 豆花视频在线看| 一区二区三区国产视频| 国产真实乱婬A片三区高清蜜臀| 国产又粗又大又爽| 九九热精品视频| 欧美A片在线播放| 国产无码久久久| 免费A片在线观看| 台湾精品无码| 在线免费AV片| 亭亭五月天| 婷婷久久婷婷| 久久亚洲热| 精品国产AV| 国产AV影片| 亚洲AV永久无码精品国产精| 亚洲成人免费| 91探花秘在线播放偷拍| 亚洲日韩在线视频播放| 爽好紧别夹喷水无码| 欧美成人在线视频网站| 欧美一区在线视频| 青草网| 无码不卡在线观看| 人人色在线观看| 国产精品熟女| 婷婷操| 精品国产午夜福利在线观看| 日韩成人性爱网站| 国产精品操逼| 91人妻无码精品蜜桃| 中文字幕精品1| 成人伦理聚合| 国产激情网站| 国产黄色片视频| 久久国产香蕉| 亚洲色逼图片| 熟妇人妻中文字幕无码老熟妇| 欧美后门菊门交3p| 少妇搡BBBB搡BBB搡造水多, | 91色图| 欧美精品成人免费片| 久久久久久| 国产毛片毛片毛片毛片毛片| 蜜桃久久久亚洲| 安徽少妇搡bbw搡bbbb| 中日韩一级片| 粉嫩小泬BBBB免费看-百度| 美女91小视频| 豆花网无码视频观看| 中文字幕毛片| 日韩v在线| 91香蕉在线视频| AV大全在线免费观看| 国产成人在线视频| 国产1页| 狠狠干在线观看| 人人操人人妻人人看| 91香蕉在线观看视频在线播放| 东京热男人的天堂| 亚洲小黄片| 成人不卡在线| 国产日韩欧美久久| 国产毛片一照区| 高清无码三级片| 五月婷婷丁香综合| 九九视频免费观看| 成人网站在线看。| aⅴ免费观看| 精品无码久久| 国产色婷婷| 免费看无码一级A片在线播放| 人人干干| 色噜噜人妻丝袜无码影院| 欧美深夜福利视频| 国产精品色婷婷| 国产精品果冻传媒| 精品无码人妻| 18禁黄网| 色色资源网| 青青草视频免费| 四虎最新地址| 狼友视频在线看| www.青青草视频| 狠狠色婷婷| 成人毛片在线观看| 色哟哟国产精品| jizz视频| 无码专区在线观看| 91水蜜桃| av黄色在线观看| 欧美成人免费网站| 午夜福利影片| 日韩无码成人片| AAA日韩| 白天操夜夜操| 麻豆网站91| 杨幂操逼视频| 精品逼| 北条麻妃无码精品AV怎么看| 国产免费黄色视频| 中文字幕精品无码亚| 日韩欧美黄色| 成人在线中文字幕| 成人爽a毛片一区二区免费| 国产高清无码一区二区| 偷拍777| 欧美在线视频一区| 91久久免费视频| 免费无码又爽又黄又刺激网站| 91九色TS另类国产人妖| 亚洲日韩国产成人精品久久| 最近中文字幕中文翻译歌词| 黄色免费视频网站| 国产一区二区三区四区五区六区七区| 调教人妻视频| 精品精品视频| 精品亚洲一区二区三区| 日本亚洲欧洲免费| 国产小视频在线| 黄色在线网站| 日韩A片| 97人妻| 欧美色五月| 人人妻人人澡| 伊人狼人香蕉| 日韩人妻无码一区二区三区中文| 日韩欧美高清| 中文字幕三级片在线观看| 香蕉黄色三级片| 狠狠躁夜夜躁人人爽人妻| 中文字幕免费视频在线播放| 欧美城综合在线观看网| 日韩AV在线直播| 加勒比日韩在线| 三级黄色免费| 国产婷婷五月天| 特级西西444www| 欧美成人综合一区| 黄色一级大片在线免费看产| 中文字幕在线永久| 日韩在线一区二区三区四区| 麻豆AV在线播放| 精品无码三级在线观看视频| 很很干在线视频| 奇米色五月| 国产一区二区三区免费视频| 99久久婷婷国产综合精品草原| 中文字字幕在线中文乱码| 国产一区二区精品| 福利一区二区视频网| 欧美精品午夜福利无码| 黄网免费看| 亚洲操逼图片| 一级免费爱爱| 久久婷婷婬片A片AAA| 亚韩AV| 翔田千里无码在线| 天堂网av在线| 日本免费一区二区三区| 91就要爱爱视频| 嫩BBB槡BBBB槡BBB小号| 欧美va亚洲va| av手机天堂| 少妇推油呻吟白浆啪啪成人片| 在线观看国产一区| 日日操操| 亚洲无码自拍| 香蕉A片| 欧美日韩亚洲另类| 91欧美亚洲| eeuss一区二区| 极品人妻疯狂3p超刺激| 免费看欧美成人A片无码| 人人操人人爽| 天天干天天日蜜臀色欲av| 无码人妻中文| 国产精品高潮呻吟| 91麻豆精品国产91久久久吃药| 日韩高清无码电影| 99热国产精品| 精产国品一区二区| 国产夫妻自拍av| 亚洲日韩免费| 日本一级大毛片a一| 中文字幕在线观看日韩| 又a又黄高清无码视频| 国产成人综合亚洲| 日韩色情网| 操逼视频免费网站| 人人操人人摸人人| 懂色中文字幕| 影音先锋91视频| 亚洲精品国产成人AV在线| 国精产品久拍自产在线网站| 免费激情| 春色Av| 日韩中文无码电影| 欧美sesese| 国产二级片| 亚洲第一网无码性色| 成人黄色在线看| 国产精品婷婷久久久| 欧美成人自拍视频| 婷婷成人电影| 中文字幕乱码免费综合久久 | 国产激情免费视频| 色综合天| 欧洲成人在线观看| 国产av一级| 一级做a视频| 欧美日韩字幕| 色爽AV| 五月丁香六月| 92自拍| 激情伊人五月天| 欧美性猛交XXXX乱大交3| 99re视频播放| 99精品视频免费在线观看| 无套免费视频欧美| 无码一区二区三区免费| 国产一区亚洲| 国产美女在线播放| 在线永久看片免费的视频| 日韩中文字| 丁香六月婷婷综合缴| 麻豆午夜成人无码电影| 日韩福利| 免费在线观看亚洲| 热99re69精品8在线播放| jizz亚洲| 91嫖妓站街埯店老熟女| 日韩中文字码无砖| 成人自拍视频| 中文人妻无码| 波多野成人无码精品视频| 浪潮在线观看完整版| 91在线一区| 日本高清黄色视频| 精品免费囯产| 中文字幕av免费观看| 91在线无码精品秘入口动作| 伊人婷婷久久| 中文字幕熟女| 伊人网大香蕉| 亚洲日本无码50p| 亚洲欧洲日韩| 激情一级片| 蜜臀久久久99久久久久久久| 91在线无码精品秘入口| 91丨九色丨蝌蚪丨对白| 免费AV在线播放| 中文字幕在线亚洲| 91一区二区在线播放精品| 97精品在线观看| 人人妻人人澡| 九一亚洲精品| 中文字幕在线资源| 毛片天天干| 久99久热| www.日韩系列| 粉嫩护士小泬18p| 日本无码一区二区三三| 亚洲婷婷综合网| 国产性爱在线观看| 日韩A级视频| 免费看18禁| 国产精品久久久久久久久久二区三区 | 丰满少妇在线观看网站| 亚洲成人电影AV| xxxxx日韩| 国产操逼免费看| 久久女人网| 成人网站在线| 日本狠狠干| 欧美成人黄色电影| 国产一级片内射| 一级免费黄色片| 蜜桃免费| 97人妻人人澡人人爽人人精品| 一级特黄大片录像i| 国产灬性灬淫灬欲水灬| 安徽妇搡BBBB搡BBB| 亚洲无码大全| 亚洲国产A片| 亚洲日韩成人电影| 吴梦梦| 国产色综合视频| 国产一级免费观看| 亚洲无码成人视频| 五月亭亭在线视频| 免费在线看黄色| 夜夜无码| a在线免费| 超碰97成人| www.插插插| 91爱爱爱爱| 成人网站在线免费| jizz久久| 中文字幕无码视频| www.俺去| 手机毛片在线播放| 国产女人18毛片水18精| 五月婷婷狠狠爱| 麻豆国产一区二区三区四区| 中文字幕精品三区无码| 午夜在线视频| 亚洲在线观看中文字幕| av无码在线观看| 91人妻人人澡人人爽精品| 91免费观看国产| 日韩无码精品电影| 亚洲欧美综合| 日日干av| 亚洲第一综合网| 99综合在线| 伊人成人免费视频| 精品在线播放| 欧美日本中文字幕| 特级特黄A级高潮播放| 精品无码电影| 香蕉视频啪啪啪| 日韩视频中文字幕| 福利网址| 3DAV一区二区三区动漫| 日本黄色中文字幕| 夜夜骑夜夜撸| 久久性爱视频| 日韩一级无码特黄AAA片| 日本黄色大片网站| 99精品久久| 一级A片亲子乱中文| 欧美日韩中文在线视频| 日韩综合精品中文字幕66| 超碰极品| 日韩无码久| 91女人18毛片水多的意思| 99久热在线精品| 2025av中文字幕| 日本成人一区| 日本黄A三级三级三级| 免费一级片| 伊人影院在线视频| 99精品在线播放| 国产一级a片| 一级片视频在线观看| 九九九九AV| 国产一区二区AV| 精品人妻午夜| 大香蕉福利在线| 精产国品一区二区区别| 天天操电影| 亚洲操操操操| 亚洲黄色在线观看| www.777av| 91大神shunv| 中文字幕日本电影| 亚洲va国产va天堂va久久| ThePorn-成人网站入口| 成人性生交片无码免费看人| AV资源在线| 躁BBB躁BBB躁BBBBB乃| 曰曰操| 国产成人秘免费观看一区二区三区 | 免费无码一区二区三区| 成人V| 成年无码| 胖老板办公室沙发无套爆秘书| 色九| 成人aV无码精品国产一区二区| 国产精品无码乱伦| 操逼视频网| 91精品大屁股白浆自慰久久久| 成人黄A片免费| 吴梦梦| 久久机热| 中文字幕免费视频在线观看| 中文字幕A片| 亚洲日韩在线a成| 欧美色性乐汇操日本娘们| 日韩在线不卡视频| A片黄色电影网站| 国产老女人农村HD| 亚洲AV无码一区毛片AV| 免费毛片基地| 久久九九国产| 亚洲精品秘一区二区三区在线观看| 成人中文字幕网站| 大秀91视频| 毛片一区二区三区| 操日本美女| www.日韩一区| 黄色小说在线看| 美日毛片| 91人妻人人澡人人爽| 日韩黄频| AAA无码| 亚洲男同Gay一区二区| 免费视频一二区| 黃色A片一級二級三級免費久久久 亚洲AV无码第一区二区三区蜜桃 亚洲综合免费观看高清完整版在线 | 日韩精品高清中文| 国产精品福利视频| 99视频久久| 人人看人人色| 在线观看无码高清视频| 国产一级在线免费观看| 成人夜间视频| 日本a在线| 92无码| 无码区一区二区| 亚洲AV毛片成人精品网站| 中文字幕无码乱伦| 性做久久久久久久久| 少妇做爱视频| 免费无码高清视频| 一级黄色免费电影| 亚洲无码123| 欧美视频基地| 成人精品一区日本无码网站suv| 曰韩一级片| 波多野结衣高潮| 日本精品乱伦| 伊人黄色| 欧美操逼逼| 一级黄色视频网站| 国产激情| 波多野结衣在线网站| 北条麻妃av在线播放| 成年人免费视频在线观看| 国产三级黄色| 三区在线观看| 在线A片免费观看| 久热只有精品| 女同一区二区三区| 国产成人综合自拍| 亚洲福利视频电影精| 中文字幕无码不卡| 国产九九| www.麻豆网91成人久久久| 日韩免费高清无码| 超碰在线人人操| 西西4444www大胆无| 黄色三级毛片| 亚洲中文字幕免费视频| 亚洲色图另类| 人人爱天天做| 青青草中文字幕| 久久久久无码国产精品不卡| 亚洲无码精品一区二区三区| 成人毛片在线视频| 国产乱子伦一区二区三区在线观看 | 国产精品乱子伦视频一区二区| 超碰9999| 五月婷婷综合在线| 久久538| 99久在线精品99re8| 欧美高清无码视频| 亚洲成人无码av| 日本A片在线播放| 色色色色五月天| 一级片视频在线观看| 台湾成人综合网| 亚洲福利网站| 亚洲AV无码精品| 一级黄色视频在线观看| 韩日一区二区| 91成人视频18| 天堂免费视频| 日韩欧美不卡| 8050午夜| 亚洲一区二区黄色电影视频网站 | 91豆花成人社区| 污视频网站在线观看| 亚洲大片免费看| 欧美久久视频| 岛国无码破解AV在线播放| 色天天综合网| 亚洲A级毛片| 伊人99| 国产熟妇码视频户外直播| 精品蜜桃一区内容| 永久免费不卡在线观看黄网站 |