iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

我在 Spring Boot 3 裡面挖呀挖呀挖系列 第 18

Day17 - Path Matching and Content Negotiation

  • 分享至 

  • xImage
  •  

Day17 - Path Matching and Content Negotiation

前言

昨日我們談完如何設定靜態資源相關的設定,可以透過配置文件也可以透過自訂義配置類進行配置,今日我們要探討URL如何Mapping到Controller以及content negotiation,而content negotiation它可以讓你訪問一樣的URL但可以回傳不同的資料類型,就讓我們開始吧!

專案建立

create module

https://ithelp.ithome.com.tw/upload/images/20231003/20128084FCa99ct61f.png
https://ithelp.ithome.com.tw/upload/images/20231003/20128084EufA1W8wN0.png

導入jackson xml

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

postman

登入postman,這邊使用web版的postman
https://ithelp.ithome.com.tw/upload/images/20231003/20128084TCE5d3h9bZ.png

Path Matching

AntPathMatcher

  • *:表示任意數量的字符。
  • ?:表示任意一个字符。
  • **:任意多層路徑。
  • {}:表示一个命名的模式占位符。
  • []:表示字符集合,例如[a-z]表示小寫字母。

PathPatternParser

效能比AntPathMatcher好,兼容AntPathMatcher,不同的是**多段匹配只允許在模式末尾使用,Spring Boot預設使用PathPatternParser。

模式切換

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

範例

@Slf4j
@Controller
public class HelloController {

    @GetMapping("/a*/b?/p1:[a-z]+")
    //@GetMapping("/a*/b?/**/p1:[a-z]+")
    public String Hello(HttpServletRequest request, @PathVariable("p1")String path){
        log.info("請求路徑變量p1:{}",path);
        String uri = request.getRequestURI();
        return uri;
    }
}

Result
https://ithelp.ithome.com.tw/upload/images/20231003/201280844YVm6jqLCm.png

Content Negotiation

content negotiation 是一種機制,他根據不同client讓同一個URI返回最適合client的資料型式,例如你有一個前後端分離的服務,那麼他就會返回json的形式,又或者你有第三方系統串接你的api,它需要xml型態的資料而你就能傳xml的資料型態給他。而Spring Boot提供兩種方式來完成content negotiation機制。

The Accept Header Strategy

  • 默認開啟
  • Server side透過http Accept請求頭期望類型進行動態返回(ex.application/json、text/xml、text/yaml)

The URL Parameter Strategy

  • 需要開啟參數匹配的設置

demo - The Accept Header Strategy

@Data
@AllArgsConstructor
@JacksonXmlRootElement//可以寫出xml
public class Employee {
    private String empName;
    private String empNo;
    private String depName;
    private String depNo;
}

HelloController

@GetMapping("/emp")
public Employee emp(){
    Employee emp = new Employee("James","2023100301","IT","A01");
    return emp;
}

Accept給定*/*、application/json返回的都是json
https://ithelp.ithome.com.tw/upload/images/20231003/20128084fj7STmOJEk.png
application/xml
https://ithelp.ithome.com.tw/upload/images/20231003/20128084qJSEyNbS2C.png

demo - The URL Parameter Strategy

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true
      #parameter-name: type #指定content negotiation使用的參數名稱

json
https://ithelp.ithome.com.tw/upload/images/20231003/201280844xAOU4gV3N.png
xml
https://ithelp.ithome.com.tw/upload/images/20231003/20128084auqHlNZEtH.png
修改請求參數名稱為type
https://ithelp.ithome.com.tw/upload/images/20231003/20128084fA89P5kwr3.png

Reference


上一篇
Day16 - customize static content
下一篇
Day18 - HttpMessageConverter
系列文
我在 Spring Boot 3 裡面挖呀挖呀挖31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言