成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于注解的Controller接口這些高級功能,你都知道嗎?

開發 前端
基于注解的Controller接口,你可以使用 @RequestMapping 注解將請求映射到控制器方法。它有多種屬性,可根據 URL、HTTP 方法、請求參數、頭和媒體類型進行匹配。該注解可以在類上使用它來表達共享映射,也可以在方法級使用它來縮小特定接口映射的范圍。

環境:SpringBoot2.7.18

1. 簡介

基于注解的Controller接口,你可以使用 @RequestMapping 注解將請求映射到控制器方法。它有多種屬性,可根據 URL、HTTP 方法、請求參數、頭和媒體類型進行匹配。該注解可以在類上使用它來表達共享映射,也可以在方法級使用它來縮小特定接口映射的范圍。

@RequestMapping 還有 HTTP 方法特定的快捷方式變體:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

通過上面的注解,我們能更加具體的去匹配我們的Controller接口方法。這些注解在開發中都是些基本的操作,并且在絕大多數情況下使用這些接口完全夠用了。接下來將介紹幾個高級用法。

2. 實戰案例

2.1 HEAD、OPTIONS請求

對于head,options請求Spring并沒有提供對應的快捷注解,我們只能通過@RequestMapping注解來指定method屬性。

@GetMapping (和 @RequestMapping(method=HttpMethod.GET))支持 HTTP HEAD 透明請求映射。控制器方法無需更改。在 javax.servlet.http.HttpServlet 中應用的響應封裝器可確保 Content-Length 標頭被設置為寫入的字節數(而不會實際寫入響應)。如下示例:

@GetMapping("/h")
public Object h() {
  System.out.println("header....") ;
  return "h method..." ;
}

當上面的接口以head方式請求時,也是可以成功進入該方法的只是并不會輸出內容到客戶端,而僅僅是通過Content-Leng告知有多少個字節內容。

圖片圖片

響應header中有Content-Length

圖片圖片

對應HEAD請求我們完全可以通過GET方式來解決。

默認情況下,HTTP OPTIONS 的處理方式是將 Allow 響應頭設置為具有匹配 URL 模式的所有 @RequestMapping 方法中列出的 HTTP 方法列表。簡單說當你通過OPTIONS請求一個URL時,Allow的響應頭會設置為你@RequestMapping(method = ...)這里你method設置的列表+OPTIONS,如下示例:

@RequestMapping(value = "/o", method = {RequestMethod.DELETE, RequestMethod.HEAD})
public Object o() {
  System.out.println("o....") ;
  return "h method..." ;
}

當上面的接口通過OPTIONS請求時,那么響應header Allow將設置為如下:

圖片圖片

如果你的@RequestMapping沒有指定method屬性值,那么Allow 頭信息會被設置為 GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS。上面的即可刪除method屬性再次請求如下:

圖片圖片

2.2 自定義請求注解

在某些場景下你可能需要自定義自己的一些注解來配置通用的匹配模式,那么這時候通過自定義請求注解的方式是非常合適的,而不用你對每一個請求都去做重復的事。

自定義請求注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping
public @interface PackMapping {


 @AliasFor(annotation = RequestMapping.class)
 String name() default "";
 @AliasFor(annotation = RequestMapping.class)
 String[] value() default {};
 @AliasFor(annotation = RequestMapping.class)
 // 配置只能是GET或POST方法
 RequestMethod[] method() default {RequestMethod.GET, RequestMethod.POST} ;
 @AliasFor(annotation = RequestMapping.class)
 String[] path() default {};
 @AliasFor(annotation = RequestMapping.class)
 String[] params() default {};
 // 設置請求header必須包含X-API-Version并且值必須是v1
 @AliasFor(annotation = RequestMapping.class)
 String[] headers() default {"X-API-Versinotallow=v1"};
 @AliasFor(annotation = RequestMapping.class)
 String[] consumes() default {};
 @AliasFor(annotation = RequestMapping.class)
 String[] produces() default {};
}

測試Controller接口

@PackMapping("/v")
public Object v() {
  System.out.println("自定義請求注解....") ;
  return "PackMapping method..." ;
}

輸出結果

圖片圖片

請求中必須攜帶X-API-Version請求header。

2.3 動態顯示注冊接口

你可以通過編程方式注冊處理程序方法,這些方法可以用于動態注冊或高級情況,例如不同URL下的同一處理程序的不同實例,如下示例:

@Configuration
public class CustomWebConfig {


  @Autowired
  public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserService handler)
      throws NoSuchMethodException {
    BuilderConfiguration options = new BuilderConfiguration() ;
    options.setPatternParser(new PathPatternParser()) ;
    RequestMappingInfo info = RequestMappingInfo.paths("/api/user/{id}").methods(RequestMethod.GET).options(options ).build();
    Method method = UserHandler.class.getMethod("getUser", Integer.class) ;
    mapping.registerMapping(info, handler, method);
  }
}

UserService

@Component
public class UserHandler {
  
  @ResponseBody
  public User getUser(@PathVairable("id")Integer id) {
    User user = new User() ;
    user.setId(id) ;
    user.setName("張三") ;
    return user ;
  }
}

輸出結果

圖片圖片

以上是本篇文章的全部內容,如對你有幫助就請作者吃個棒棒糖??。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2021-08-05 18:21:29

Autowired代碼spring

2016-01-11 09:48:07

2021-04-10 07:04:00

WPS技巧辦公軟件

2016-03-18 19:03:35

認知計算IBM

2022-11-10 09:00:41

2019-02-12 11:15:15

Spring設計模式Java

2019-07-08 10:18:38

MPLSIP數據

2023-08-30 07:39:16

PawSQL數據庫

2023-04-28 12:37:59

Spring@Bean使用方式

2023-04-23 09:50:50

@BeanSpring

2018-05-15 08:27:20

Scikit-lear機器學習Python

2024-03-26 10:10:45

JavaScript操作符操作表達式

2022-09-07 09:01:14

JS操作符運算符

2020-05-27 11:30:54

Chrome DevT前端命令

2024-01-26 08:22:26

XMLJSON格式

2023-02-15 08:12:19

http超時過濾器

2018-04-24 15:40:39

無線路由器無線網絡上網

2020-10-28 11:20:55

vue項目技

2022-05-02 09:17:41

Edge瀏覽器微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产主播第一页 | 久草在线在线精品观看 | 日韩欧美在线视频 | 久久99国产精一区二区三区 | 高清国产一区二区 | 久草在线 | 日韩国产中文字幕 | 日韩免费一级 | 中文av电影| 国产欧美日韩一区二区三区在线观看 | 高清欧美性猛交xxxx黑人猛交 | 69av在线视频| 国产精品国产精品国产专区不蜜 | 美女日皮网站 | 日韩精品在线播放 | 亚洲免费片 | 亚洲一二三区不卡 | 免费视频一区 | 日韩伦理一区二区 | 欧美一级电影免费观看 | 亚洲成人福利 | 不卡一区二区三区四区 | 欧美精品一二区 | av一区二区三区四区 | 欧美精品中文字幕久久二区 | 亚洲在线免费观看 | 一区二区三区四区毛片 | 日本一二区视频 | 久热国产在线 | 97精品一区二区 | 精品久久久一区二区 | 二区精品| 国产一区二区三区在线 | 涩涩视频网站在线观看 | 国产精品久久国产精品久久 | av香港经典三级级 在线 | 久色视频在线观看 | 久久精品成人 | 成人在线小视频 | 一级片子 | 日韩国产一区二区三区 |