我在Spring Boot:中有一个REST api
@GetMapping("/test")
public MyClass getData() {
return something;
}
此端点最多可使用10个RequestParams进行请求。当然,我知道所有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等(,因此以下解决方案非常接近,但没有解决它,因为映射需要一致的值类型:如何使用spring-mvc使用@RequestParam捕获多个参数
实现这一点的一种方法是接收带有params的Map,问题是所有params都具有相同的类型,并且您必须在代码中转换为正确的类型:
@ResponseBody
public String updateFoos(@RequestParam Map<String,Object> allParams) {
return "Parameters are " + allParams.entrySet();
}
您可以在方法中定义所有参数,并将它们设置为">不需要"。
@GetMapping("/test")
public MyClass getData(@RequestParam(name="p1", required=false) String p1,
@RequestParam(name="p2", required=false) Integer p2,
...) {
return something;
}
然后你可以选择在你的url中定义哪些参数。其他为空。或者在RequestParam
-注释中定义一个默认值。
您可以使用@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/测试