我正在设计一个rest API,以基于某些参数获取资源,但是在某些情况下,这些参数的数量在15到20之间。
我正在考虑使用 POST 请求来基于这15个参数获取资源。我知道在获取资源的情况下不应使用 POST 请求。
我想知道是否有更好的选择来处理此问题,然后发送POST请求?
答案 0 :(得分:1)
您可以通过使用地图获得服务。它将接受所有参数。
/test?A=ABC&B=123
@RequestMapping(value="/test",method = RequestMethod.GET)
public String testUrl(@RequestParam Map<String, String> parameters)
{
println(parameters.get("A"));
println(parameters.get("B"));
return parameters.get("A");
}
输出将是 美国广播公司 123
答案 1 :(得分:1)
GET不限制参数的数量 唯一的限制是URL的长度(包含这些参数) 因此,如果您期望参数和值会导致网址过长,则可以改用POST
标准表示,URL长度不得超过2,083个字符 即使某些浏览器/服务器允许更多访问,最好还是坚持使用此值,以对所有浏览器/服务器/网关提供广泛的支持
答案 2 :(得分:1)
为了使您的@Controller代码更简洁(例如,摆脱15倍的@RequestParam
),可以使用@ModelAttribute
批注。
@GetMapping(value="/things")
public List<Thing> findAllThings(@ModelAttribute ThingDTO thing) {
// logic
}
和您的ThingDTO
类:
public class ThingDTO {
private String name;
private ThingType type;
[...] //getters, setters etc.
}
这将把您的类属性映射到@RequestParam
。该代码看起来更干净了。
关于URL长度,您应该在此处检查主题:What is the maximum length of a URL in different browsers?,并确定是否有可能超过限制。
您应该使用什么?对于数据检索,在99%的情况下,我会选择GET
,因此,如果以上内容对您而言不是障碍,请选择GET
。如果有可能超过限制,请使用POST
。
答案 3 :(得分:0)
对于服务器来说,参数长度应该不是问题。
您应该阅读有关如何设计Rest API的信息。我建议您像这样构建它:
/api/{version}/{entity}/{id}
如果您使用的是Spring Boot,则构建起来非常简单。
只需编写一个像这样的控制器
@RestController
@RequestMapping("/api/users")
public class UsersService {
@Autowired
UsersRepository userRepo;
@RequestMapping(value="/find-all", method=RequestMethod.GET)
public Page<User> getAllUsers(@RequestParam(value="page", defaultValue = "0", required=false)Integer page,
@RequestParam(value="size", defaultValue= "20", required=false)Integer size){
...
}
@RequestMapping(value="/find/{id}")
public ResponseEntity<User> getUserById(@PathVariable(name="id")Long id){
...
}
@RequestMapping(value="/save", method=RequestMethod.POST)
public ResponseEntity<User> createUser(@RequestBody User user){
...
}
@RequestMapping(value="/delete/{id}", method = RequestMethod.GET)
public ResponseEntity<Void> deleteUser(@PathVariable(name="id")Long id){
...
}
}
希望此示例代码可帮助您构建api。只需将您的ID作为PathVariable传递即可,如deleteUser()
或findUser()
中所示。
如果您需要更多参数,则可以扩展列表或使用getAllUsers()
中使用的RequestParam。
参数是可选的,但需要一个默认值。