我有一个 Java REST API,由 2 个不同的使用者使用。默认情况下,REST 原则我的 API 应该定义请求 header 的名称。但现在我没有常见的情况。消费者使用不同的安全层,它提供不同的 header ,这意味着两种方式的参数相同。
示例方法: (不是真正的代码)
对于第一个消费者:
@PostMapping("/number")
Integer getNumber(@RequestHeader("no") String number, @RequestBody User user) {
/*...*/
}
对于第二个消费者:
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user) {
/*...*/
}
我在一个 Controller 中最多有 10 个方法,它们应该具有相同的名称和逻辑,但 header 不同。请求路径前缀可能不同。
<小时/>问题:
block 引用> <小时/>How to simplify REST controller and don't create 2 different controllers with same methods and same logic?
我尝试过的:
我尝试了几个示例来创建一个具有 2 个不同接口(interface)、具有相同方法但不同映射的 Controller 。
示例:
Controller 类
@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); }
结果:
block 引用>Controller maps only with the first interface. So
http://.../application/num
works fine, buthttp://.../application/number
- gets404
error code. That means Java Spring-Boot doesn't have such functionality. Need some more ideas.项目由
Java 8
开发;spring-boot:2.1.1.RELEASE
;gradle
最佳答案
According to this , If we're not sure which headers will be present, or we need more of them than we want in our method's signature, we can use the @RequestHeader annotation without a specific name.
变量类型有多种选择:Map
、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())
{
//...
}
}
关于java - 如何使用相同的方法和不同的 header 来简化 REST Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60000426/