简体   繁体   中英

Difference between DELETE HTTP request parameters and request body

I'm trying to understand the behaviour of an HTTP DELETE request.

On my java web application, I defined the following

@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);
}

And on a java client, I do the following

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);
}

The first request works fine, the log is well displayed. However, on the second case, i get the following error

HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<java.lang.String> com.thales.atm.thmi.microservice.CanvasController.deleteGraphicObject2(java.lang.String)]

I use the module spring-boot-starter-web of spring boot (v2.7.1 on my project).

Can someone explain me what's wrong in my ussage of body parameters for this delete request?

Thanks!

I use the module spring-boot-starter-web of spring boot (v2.7.1 on my project) .

According to the most recent version of rest template.

void delete(String url, Map<String,?> uriVariables)

void delete(String url, Object... uriVariables)

void delete(URI url)

No delete method expects a request body to be passed in method parameters. Uri variables are something different. They are passed and then used to modify the URI accordingly. If for example your URI was ./some1/some2/{foo} , you pass a uriVariable like 2 and it makes the URI ./some1/some2/2 .

This is not what you need and you currently have no other choice, than to work around this issue, as it remains at your disposal the general exchange method of restTemplate.

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

Execute the HTTP method to the given URI template, writing the given request entity > to the request, and returns the response as ResponseEntity.

This is how it could be used.

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM