昨日我們談完如何設定靜態資源相關的設定,可以透過配置文件也可以透過自訂義配置類進行配置,今日我們要探討URL如何Mapping到Controller以及content negotiation,而content negotiation它可以讓你訪問一樣的URL但可以回傳不同的資料類型,就讓我們開始吧!
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
登入postman,這邊使用web版的postman
效能比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
content negotiation 是一種機制,他根據不同client讓同一個URI返回最適合client的資料型式,例如你有一個前後端分離的服務,那麼他就會返回json的形式,又或者你有第三方系統串接你的api,它需要xml型態的資料而你就能傳xml的資料型態給他。而Spring Boot提供兩種方式來完成content negotiation機制。
@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
application/xml
spring:
mvc:
contentnegotiation:
favor-parameter: true
#parameter-name: type #指定content negotiation使用的參數名稱
json
xml
修改請求參數名稱為type