带有请求正文的GET调用-控制器无法访问请求正文

时间:2019-01-03 10:05:34

标签: java spring rest

由于请求参数列表超出限制,我尝试使用请求正文(JSON)进行get调用。我能够通过邮递员/失眠症发送请求,并且请求到达控制器为止,而没有任何错误。但是“ requstBody”在控制器上为空。我在这里想念什么?

@GET
@Path("\path")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response getResponse(String requestBody) throws IOException { }

当我用@POST替换@GET时,requestBody具有价值。对于GET通话,我们还需要添加其他内容吗?

4 个答案:

答案 0 :(得分:3)

  

由于请求参数列表超出限制,我尝试使用请求正文(JSON)进行get调用。我能够通过邮递员/失眠症发送请求,并且请求到达控制器为止,而没有任何错误。但是“ requstBody”在控制器上为空。我在这里想念什么?

您缺少的一件事是,使用GET的请求正文的语义没有很好地定义。

RFC 7231, Section 4.3.1

  

GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。

答案 1 :(得分:2)

@RequestBody放入String requestBody参数

答案 2 :(得分:2)

@RequestMapping("/path/{requestBody}")
public Response getResponse(@PathVariable String requestBody) throws IOException { }

答案 3 :(得分:2)

在Http Get方法中有两种发送参数的方法。 PathVariableRequestParam。这样,发送的参数在请求URL中可见。例如:

www.sampleAddress.com/countries/{parameter1}/get-time?city=someValues

在上述请求中,parameter1是路径变量,parameter2是请求参数。因此,有效URL的示例为:

www.sampleAddress.com/countries/Germany/get-time?city=berlin

要在Java控制器中访问这些参数,您需要为参数定义一个特定的名称。例如,以下控制器将接收此类请求:

@GetMapping(value = "/countries/{parameter1}/get-time", produces = "application/json; charset=utf-8")
public String getTimeOfCities(
    @PathVariable(value = "parameter1") String country,
    @RequestParam(value = "city") String city
){
    return "the method is not implemented yet";
}

您可以通过RequestBody请求发送Get,但根据this链接不建议这样做。

  

是的,您可以使用GET发送正文,否,它永远不会有用   为此。

elasticsearch website中的详细说明也很好:

  

某些语言(特别是JavaScript)的HTTP库不允许GET请求具有请求正文。实际上,有些用户很惊讶GET请求曾经被允许具有正文。

     

事实是,RFC 7231是处理HTTP语义和   内容-没有定义带有GET请求的GET请求应该如何处理   身体!结果,一些HTTP服务器允许它,而某些-特别是   缓存代理-不。

如果您想使用Post方法,也可以拥有RequestBody。如果您想通过发布请求发送数据,则合适的控制器应如下所示:

@PostMapping(value = "/countries/{parameter1}/get-time", produces = "application/json; charset=utf-8")
public String getTimeOfCitiesByPost(
        @PathVariable(value = "parameter1") String country,
        @RequestParam(value = "city") String city,
        @RequestBody Object myCustomObject

){
    return "the method is not implemented yet";
}

myCustomObject可以具有您在代码中定义的任何类型的数据。请注意,通过这种方式,您应该以{{1​​}}字符串的形式发送请求正文。