gpt4 book ai didi

java - 如何使用相同的方法和不同的 header 来简化 REST Controller ?

转载 作者:行者123 更新时间:2023-12-02 01:06:24 27 4
gpt4 key购买 nike

我有一个 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 不同。请求路径前缀可能不同。

<小时/>

问题:

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);
}

结果:

Controller maps only with the first interface. So http://.../application/num works fine, but http://.../application/number - gets 404 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.

变量类型有多种选择:MapMultiValueMapHttpHeaders 对象。

示例

@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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com