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

标签 java spring rest spring-boot gradle

我有一个 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/

相关文章:

java - 更新时发生 TransactionRequiredException

java - 如何使用 jQuery 将包含对象数组的对象数组传递给 Spring MVC Controller ?

json - 按类别或字段过滤休息服务

wordpress - 如何让 WordPress 的 REST API 包含用户元数据?

java - android fragment 的最佳实践?

java - 如何将现有对象传递给 Spring WebApplicationContext?

java - 编译 PrimeFaces 1.1

java - RESTful 网络服务中的资源路径

java - React Native 的 BitmapFactory : Unable to decode stream: java. io.FileNotFoundException

java - Spring Boot 应用程序中未调用调度程序作业