DELETE HTTP请求参数和请求正文之间的差异



我正在尝试理解HTTP DELETE请求的行为。

在我的java web应用程序上,我定义了以下

@DeleteMapping("url/route")
public ResponseEntity<String> route(@RequestParam int param1, @RequestParam long param2, @RequestParam long param3, @RequestParam String param4) {
System.out.println(param1 + "-" + param2 + "-" + param3 + "-" + param4 );
return new ResponseEntity<String>(HttpStatus.OK);
}

@DeleteMapping("url/route2")
public ResponseEntity<String> route2(@RequestBody String body) {        
System.out.println(body);
return new ResponseEntity<String>(HttpStatus.OK);
}

在java客户端上,我执行以下

public final void myFunction(final int param1, final long param2, final long param3, final String param4) {
restTemplate.delete("http://localhost:8090/url/route?"
+ "param1=" + param1 + "&"
+ "param2="+ param2 + "&"
+ "param3=" + param3 + "&"
+ "param4=" + param4, String.class);

restTemplate.delete("http://localhost:8090/url/route2", "SomeText", String.class);
}

第一个请求运行良好,日志显示良好。然而,在第二种情况下,我得到了以下错误

HttpMessageNotReadableException:缺少必需的请求正文:public org.springframework.http.ResponseEntity<java.lang.String>com.thales.atm.thmi.microservice.CanvasController.deleteGraphicObject2(java.lang.String(]

我使用spring-boot的模块spring-boot-starter-web(在我的项目中是v2.7.1(。

有人能解释一下我对这次删除请求的身体参数的分析有什么问题吗?

谢谢!

我在我的项目(。

根据rest模板的最新版本,它只提供以下delete方法,并且这些方法都不希望将entity作为参数发送到http请求的request body

无效删除(字符串url,映射<字符串,?>uriVariables(

void delete(字符串url,对象…uriVariables(

无效删除(URI url(

上述方法提供的Uri变量有所不同。它们被传递,然后用于相应地修改URI。例如,如果您的URI是./some1/some2/{foo},那么您传递一个类似2的uriVariable,它会使URI成为./some1/some2/2

这不是您所需要的,您目前除了解决这个问题之外别无选择,因为它仍然由您使用restTemplate的通用exchange方法。

<T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> >  responseType, Object... uriVariables)

对给定的URI模板执行HTTP方法,写入给定的请求实体>并将响应作为ResponseEntity返回。

这就是它的使用方法。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN_VALUE);
HttpEntity<String> entity = new HttpEntity<String>("SomeText", headers);
restTemplate.exchange("http://localhost:8090/url/route2", HttpMethod.DELETE, entity, String.class);

最新更新