簡體   English   中英

DELETE HTTP 請求參數和請求體的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM