Java 使用请求正文获取调用-无法在控制器上访问请求正文

Java 使用请求正文获取调用-无法在控制器上访问请求正文,java,spring,rest,Java,Spring,Rest,我正在尝试使用请求体(JSON)执行get调用,因为请求参数列表超出了限制。我可以通过邮递员/失眠症发送请求,并且请求无任何错误地到达till控制器。但控制器上的“requstBody”为空。我错过了什么 @GET @Path("\path") @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) public Response getResponse(String requestBody) throws IOException { }

我正在尝试使用请求体(JSON)执行get调用,因为请求参数列表超出了限制。我可以通过邮递员/失眠症发送请求,并且请求无任何错误地到达till控制器。但控制器上的“requstBody”为空。我错过了什么

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

当我用@POST替换@GET时,requestBody具有值。对于GET调用,我们还需要添加什么吗?

@RequestBody
放在
字符串RequestBody
参数上

在Http
GET
方法中有两种发送参数的方法<代码>路径变量和
请求参数
。这样,发送的参数在请求URL中可见。例如:

@RequestMapping("/path/{requestBody}")
public Response getResponse(@PathVariable String requestBody) throws IOException { }
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";
}
您可以通过
Get
请求发送
RequestBody
,但根据链接,不建议这样做

是的,你可以用GET发送一个body,而不是,它从来没有用过 这样做

中的这一阐述也很好:

某些语言(特别是JavaScript)的HTTP库不允许GET请求具有请求体。事实上,有些用户对GET请求被允许有一个主体感到惊讶

事实上,RFC 7231是处理HTTP语义和 内容不定义使用 身体!因此,一些HTTP服务器允许这样做,而一些HTTP服务器尤其允许这样做 缓存代理不会

如果要使用
Post
方法,也可以使用
RequestBody
。如果您希望通过post请求发送数据,则适当的控制器如下所示:

@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
可以包含您在代码中定义的任何类型的数据。注意,通过这种方式,您应该将请求正文作为
Json
字符串发送

我正在尝试使用请求体(JSON)执行get调用,因为请求参数列表超出了限制。我可以通过邮递员/失眠症发送请求,并且请求无任何错误地到达till控制器。但控制器上的“requstBody”为空。我错过了什么

@GET
@Path("\path")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response getResponse(String requestBody) throws IOException { }
您缺少的一点是,GET请求主体的语义没有得到很好的定义

:

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


我建议你看一看:@maio290链接没有显示如何解决它。分享在GET call中传递请求体的道德规范。在这段代码中添加一些细节会很好。为什么会有这些注释?@mkjh我的要求是在requestBody中传递细节,而不是requestParameter/PathVariable@vineeth但请求主体是用于POST的。您应该为GET使用Urirequest@mkjh请参阅上面maio290提供的链接。GET调用也支持body您也可以使用GET方法发送body,但在大多数情况下它被忽略。@hamid从其他一些链接可以看出,通过GET调用我们也可以传递RequestBody。请看@MuratGüvenç这不是一种标准方法,我建议防止这种情况发生。绝对不是一种标准或建议的方法。如果可能的话,阻止这种API设计。一些HTTP服务器允许这样做,而一些缓存代理则不允许。我们使用Tomcat尝试了一个POC,并在该POC上成功地传递了requestBody。但是当我们在Weblogic(一个缓存代理服务器)上尝试同样的方法时,我们没有成功。我可以确认springBoot 2.1.1.RELEASE可以使用它。拒绝请求意味着拒绝requestBody,对吗?因为我可以用请求点击我的控制器,但是请求主体是empty@vineeth引用旧的C++标准新闻组:“未定义”=“可以让恶魔从你的鼻子里飞出来”。因此,服务器或框架采取的任何行动都将被视为正常。无论是拒绝请求、忽略主体还是使用主体。