我有一个Java REST API,供2个不同的使用者使用。默认情况下,REST原则我的API应该定义请求标头的名称。但是现在我没有共同的情况。消费者使用不同的安全层,该安全层提供不同的头,这两种方式都意味着相同的参数。
示例方法:( 不是真实代码)
对于第一个使用者:
@PostMapping("/number")
Integer getNumber(@RequestHeader("no") String number, @RequestBody User user) {
/*...*/
}
对于第二个消费者:
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user) {
/*...*/
}
一个控制器中最多有10个方法,它们应该具有相同的名称和逻辑,但标头不同。请求路径前缀可以不同。
如何简化REST控制器并且不使用相同的方法和相同的逻辑创建两个不同的控制器?
我尝试了几个示例,使用相同的方法,但映射不同,创建了一个具有2个不同接口的控制器。
控制器类
@RestController
@RequestMapping(path ="/application")
@Api(tags = {"application"})
public class ApplicationController implements AppMapping1, AppMapping2 {
@Override
public Integer getNumber(String number, User user) {
/*...*/
}
}
第一个界面
interface AppMapping1 {
@PostMapping("/num")
Integer getNumber(@RequestHeader("num") String number, @RequestBody User user);
}
第二界面
interface AppMapping2 {
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user);
}
控制器仅与第一个接口映射。因此
http://.../application/num
工作正常,但http://.../application/number
-获取404
错误代码。这意味着Java Spring-Boot没有这种功能。需要更多的想法。
开发项目Java 8
; spring-boot:2.1.1.RELEASE
;gradle
根据这个,如果我们还不能确定这头会出现,或者我们需要更多的人比我们希望在我们的方法的签名,我们可以使用@RequestHeader注解没有一个特定的名称。
变量类型有几种选择:a Map
,a MultiValueMap
或HttpHeaders
对象。
样品
@PostMapping("/number")
public Integer getNumber(@RequestHeader Map<String, String> headers) {
if (Optional.ofNullable(headers.get("no")).isPresent()){
//...
}
else if (Optional.ofNullable(headers.get("number")).isPresent())
{
//...
}
}