使用相同参数的多个 REST API 调用的最佳做法是什么
What is the best practice for multiple REST API calls with the same parameters
我有一个接收各种参数的 REST API 列表,这些参数旨在搜索、过滤和 return 返回前端的数据。
@GetMapping(value = "/api1", params = {"x,y,z,age,location"})
@GetMapping(value = "/api2", params = {"a,b,c,d,age,location"})
@GetMapping(value = "/api3", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api4", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api5", params = {"p,q,r,s,,age,location"})
如您所见,问题在于有一些参数(年龄、位置)对所有这些端点都是通用的。
计划是我们可能需要为所有这些端点引入一个新参数,例如 'gender'。
是否有最佳实践来跨API处理这些公共参数,以便我们不需要修改每个Controller并添加新添加的请求参数?
控制器看起来像这样:
@RestController
public class UserFilterController {
@GetMapping(path = "/api1")
public ResponseEntity filterUserWithApi1(String x, String y, String z, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api2")
public ResponseEntity filterUserWithApi2(String a, String b, String c, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api3")
public ResponseEntity filterUserWithApi3(String d, String e, String f, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api4")
public ResponseEntity filterUserWithApi4(String g, String s, String h, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api5")
public ResponseEntity filterUserWithApi5(String j, String k, String l, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
}
如果路径不一样,你不需要在@GetMapping
注解中设置params
字段,你可以简单地做:
@GetMapping(path = "/api1")
public void myFunction( @RequestParam("age") String age, @RequestParam("location") String location, ... ) {
...
}
如果是同一个路径,也可以这样做,但是需要在RequestParam注解中加上“required=false”,手动处理一些字段存在与否时要做什么
如果您不知道请求中会有多少参数,您可以使用 @RequestParam 作为 Map,如下所示 -
@GetMapping(path = "/api1")
public void test(@RequestParam Map<String, String> parameters) {
//TODO
String value1 = parameters.get("key1");
........
}
您可以按如下方式传递这些参数 -
/api1?key1=value1&key2=value2...
或-
@GetMapping(path = "/api1/{age}/{location}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
@PathVariable("location") String location,
@RequestParam("x") String x,
@RequestParam("y") String y,
@RequestParam("z") String z) {
return new ResponseEntity(HttpStatus.OK);
}
要求-
/api1/24/earth?x=x_value&y=y_value&z=z_value
或-
@GetMapping(path = "/api1/{age}/{location}/{x}/{y}/{z}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
@PathVariable("location") String location,
@PathVariable("x") String x,
@PathVariable("y") String y,
@PathVariable("z") String z)
{
return new ResponseEntity(HttpStatus.OK);
}
请求 -
/api1/<age_value>/<location_value>/<x_value>/<y_value>/<z_value>
我相信您的查询参数是一个具有多个值的属性,age/location 是最后出现的其他一些强制性查询参数。这就是我将如何编写已知给定参数的控制器
@GetMapping(path = "/test")
public Map<String, String> test(@RequestParam("alphabets") Set<String> alphabets,
@RequestParam("age") int age,
@RequestParam("location") String location) {
final Map<String, String> responseMap = new HashMap<>();
responseMap.put("alphabets", alphabets.toString());
responseMap.put("age", Integer.toString(age));
responseMap.put("location", location);
return responseMap;
}
这个控制器的调用是这样的
http://localhost:8080/test?alphabets=a&age=1&location=test
http://localhost:8080/test?alphabets=a,b,c&age=1&location=test
现在您可以根据字母表中的值创建连接。
谢谢。
我有一个接收各种参数的 REST API 列表,这些参数旨在搜索、过滤和 return 返回前端的数据。
@GetMapping(value = "/api1", params = {"x,y,z,age,location"})
@GetMapping(value = "/api2", params = {"a,b,c,d,age,location"})
@GetMapping(value = "/api3", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api4", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api5", params = {"p,q,r,s,,age,location"})
如您所见,问题在于有一些参数(年龄、位置)对所有这些端点都是通用的。
计划是我们可能需要为所有这些端点引入一个新参数,例如 'gender'。 是否有最佳实践来跨API处理这些公共参数,以便我们不需要修改每个Controller并添加新添加的请求参数?
控制器看起来像这样:
@RestController
public class UserFilterController {
@GetMapping(path = "/api1")
public ResponseEntity filterUserWithApi1(String x, String y, String z, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api2")
public ResponseEntity filterUserWithApi2(String a, String b, String c, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api3")
public ResponseEntity filterUserWithApi3(String d, String e, String f, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api4")
public ResponseEntity filterUserWithApi4(String g, String s, String h, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping(path = "/api5")
public ResponseEntity filterUserWithApi5(String j, String k, String l, String age, String location) {
return new ResponseEntity(HttpStatus.OK);
}
}
如果路径不一样,你不需要在@GetMapping
注解中设置params
字段,你可以简单地做:
@GetMapping(path = "/api1")
public void myFunction( @RequestParam("age") String age, @RequestParam("location") String location, ... ) {
...
}
如果是同一个路径,也可以这样做,但是需要在RequestParam注解中加上“required=false”,手动处理一些字段存在与否时要做什么
如果您不知道请求中会有多少参数,您可以使用 @RequestParam 作为 Map,如下所示 -
@GetMapping(path = "/api1")
public void test(@RequestParam Map<String, String> parameters) {
//TODO
String value1 = parameters.get("key1");
........
}
您可以按如下方式传递这些参数 -
/api1?key1=value1&key2=value2...
或-
@GetMapping(path = "/api1/{age}/{location}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
@PathVariable("location") String location,
@RequestParam("x") String x,
@RequestParam("y") String y,
@RequestParam("z") String z) {
return new ResponseEntity(HttpStatus.OK);
}
要求-
/api1/24/earth?x=x_value&y=y_value&z=z_value
或-
@GetMapping(path = "/api1/{age}/{location}/{x}/{y}/{z}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
@PathVariable("location") String location,
@PathVariable("x") String x,
@PathVariable("y") String y,
@PathVariable("z") String z)
{
return new ResponseEntity(HttpStatus.OK);
}
请求 -
/api1/<age_value>/<location_value>/<x_value>/<y_value>/<z_value>
我相信您的查询参数是一个具有多个值的属性,age/location 是最后出现的其他一些强制性查询参数。这就是我将如何编写已知给定参数的控制器
@GetMapping(path = "/test")
public Map<String, String> test(@RequestParam("alphabets") Set<String> alphabets,
@RequestParam("age") int age,
@RequestParam("location") String location) {
final Map<String, String> responseMap = new HashMap<>();
responseMap.put("alphabets", alphabets.toString());
responseMap.put("age", Integer.toString(age));
responseMap.put("location", location);
return responseMap;
}
这个控制器的调用是这样的
http://localhost:8080/test?alphabets=a&age=1&location=test
http://localhost:8080/test?alphabets=a,b,c&age=1&location=test
现在您可以根据字母表中的值创建连接。
谢谢。