如果请求参数超过15,我应该使用POST还是GET?

时间:2019-03-20 06:41:24

标签: java spring rest spring-boot

我正在设计一个rest API,以基于某些参数获取资源,但是在某些情况下,这些参数的数量在15到20之间。

我正在考虑使用 POST 请求来基于这15个参数获取资源。我知道在获取资源的情况下不应使用 POST 请求。

我想知道是否有更好的选择来处理此问题,然后发送POST请求?

4 个答案:

答案 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。

参数是可选的,但需要一个默认值。