【问题标题】:How do I handle an unknown number of RequestParams in Spring Boot REST?如何在 Spring Boot REST 中处理未知数量的 RequestParam?
【发布时间】:2021-07-07 10:54:33
【问题描述】:

我在 Spring Boot 中有一个 REST api:

@GetMapping("/test")
public MyClass getData() { 

    return something;
}

最多可以使用 10 个 RequestParam 请求此端点。我当然知道所有 10 个可能的 RequestParams,但是客户可以选择使用 0 到所有 10 个 RequestParams 之间的任何地方进行请求。

现在我需要一种方法来处理这个问题,而无需将所有 10 个 RequestParam 作为参数插入到 getData() 方法中。是否不可能在一个类中注册所有可能的 RequestParams,并将该类用作 getData() 的参数?

类似这样的:

public class ParamClass {
    private @RequestParam("ParamOne") String ParamOne;
    private @RequestParam("ParamTwo") Set<String> ParamTwo;
    private @RequestParam("ParamThree") Integer ParamThree;
}

然后

@GetMapping("/test")
public MyClass getData(@RequestParam ParamClass params) { 

    return something;
}

请注意:参数可以是不同的类型(String、int、Set 等),因此以下解决方案非常接近但无法解决,因为映射需要一致的值类型:how to capture multiple parameters using @RequestParam using spring mvc?

【问题讨论】:

    标签: java spring-boot rest http-request-parameters


    【解决方案1】:

    一种方法是接收带有参数的 Map,问题是所有参数都具有相同的类型,您必须在代码中转换为正确的类型:

    @ResponseBody
    public String updateFoos(@RequestParam Map<String,Object> allParams) {
        return "Parameters are " + allParams.entrySet();
    }
    

    【讨论】:

    • 这样做的缺点是这 10 个已知参数现在是无类型的,所以我不推荐这种方法。如果参数是动态的,即在编译时名称是未知的,那么你会这样做,但是对于 10 个众所周知但可选的参数,这是错误的方法。
    【解决方案2】:

    您可以在方法中定义所有参数并将它们设置为“不需要”。

    @GetMapping("/test")
    public MyClass getData(@RequestParam(name="p1", required=false) String p1,
        @RequestParam(name="p2", required=false) Integer p2,
        ...) { 
        return something;
    }
    

    然后您可以选择在您的 url 中定义哪些参数。其他为空。或者您在RequestParam-Annotation 中定义一个默认值。

    【讨论】:

    • 谢谢,我已经知道了......我在问:“......我需要一种方法来处理这个问题,而无需将所有 10 个 RequestParams 作为参数插入到 getData() 方法中”跨度>
    • @Ben You 说 "client 可以选择使用 0 到所有 10 个 RequestParams 之间的任何地方进行请求",这意味着你需要所有 10 个,所以为什么不使用自动转换为使用@RequestParam 时免费获得的声明参数类型?要求不必申报所有 10 个没有任何意义。
    【解决方案3】:

    你可以使用@RequestBody 注解。它将 HttpRequest 主体映射到类对象。 由于 spring boot 在其类路径中有 jackson,它会将入站 HttpRequest 主体自动反序列化到 Java 对象上。

    public class ParamClass {
     String paramOne;
     String paramTwo;
     ....
     String paramTem;
     
     // default constructor
     
     // all getters
     // all setters
    

    }

    @PostMapping("/test")
    public MyClass getData(@RequestBody ParamClass params) { 
    
        return something;
    }
    

    客户端应该发送 json 数据到 api /test

    【讨论】:

    • 我一直在寻找类似的东西,但它不起作用。它说“缺少必需的请求正文”
    • 嗨@Ben,请检查我是否更新了代码。将 @GetMapping("/test") 更改为 @PostMapping("/test") 所以你必须从你的 ajax 请求中发送 POST 请求。例如,如果您使用的是 JQuery,则可以使用,
    • 嗨@Ben,必须从你的ajax请求发送POST请求。例如,如果您使用的是 JQuery,则可以使用 var data ={ "paramOne":"value 1", "paramTwo":"value 2" } $.ajax({ url : 'your-post-url', type : "POST", data : JSON.stringify(data), contentType : 'application/json', dataType : 'json', success : function(result) { //success handler code here } }); 之类的东西,您可以使用简单的 rest api 工具,例如 restapi.tools
    猜你喜欢
    • 2016-12-01
    • 2022-07-12
    • 1970-01-01
    • 2013-12-12
    • 2012-11-13
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多