[英]Difference between DELETE HTTP request parameters and request body
我試圖了解 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:缺少所需的請求正文:公共 org.springframework.http.ResponseEntity<java.lang.String> com.thales.atm.thmi.microservice.CanvasController.deleteGraphicObject2(java.lang.String)]
我使用 spring 引導的模塊 spring-boot-starter-web (我的項目上的 v2.7.1)。
有人可以解釋我在使用此刪除請求的正文參數時有什么問題嗎?
謝謝!
我使用spring 啟動的模塊 spring-boot-starter-web (我的項目上的 v2.7.1) 。
根據最新版本的 rest 模板。
無效刪除(字符串 url,地圖<字符串,?> uriVariables)
無效刪除(字符串 url,Object ... uriVariables)
無效刪除(URI 網址)
沒有刪除方法期望在方法參數中傳遞請求正文。 Uri 變量是不同的。 它們被傳遞,然后用於相應地修改 URI。 例如,如果你的 URI 是./some1/some2/{foo}
,你傳遞一個 uriVariable 像 2 並且它使 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.