RestTemplate.exchange() 删除删除请求正文

use*_*804 5 java rest spring

我使用下面的方法遇到了一个奇怪的问题。

@Override
public String deleteToEe(String body) {     
    logger.debug("Request body");
    logger.debug(body);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
    headers.add("partner", "test");
    headers.add("api_key", "certxxxx");
    HttpEntity<String> request = new HttpEntity<String>(body, headers);
    ResponseEntity<String> result = null;
    try {
        result = restTemplate.exchange(targetUrl, HttpMethod.DELETE, request, String.class);
    } catch (RestClientException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return result.getBody();
}
Run Code Online (Sandbox Code Playgroud)

当我通过 Postman 命中控制器请求映射来触发此方法时,它起作用了。但是当测试人员通过集成测试触发此方法时,或者当我使用curl触发此方法时

curl -X DELETE -H "Accept: application/json" -H "Content-type: application/json" -d "{"userName": "21", "courseId": "104882_bfaculty3_1024", "isbn": "9780323055", "schoolUserId": "1234" }" http://localhost:8080//api/provision
Run Code Online (Sandbox Code Playgroud)

此时我在代码中遇到空指针异常

result = restTemplate.exchange(targetUrl, HttpMethod.DELETE, request, String.class);
Run Code Online (Sandbox Code Playgroud)

我已经在代码中设置了断点,看起来我们有一个请求正文,但由于某种原因,它在restTemplate.exchange() 调用中被删除。有人见过这样的事情吗?

zde*_*ine 1

使用 HTTP DELETE 方法时,请求中不应包含任何正文。许多框架不鼓励使用它或警告您主体可能会被丢弃。原因是您想要删除由 URI 标识的某些资源,因此不需要正文。

听起来这可能就是你的情况。它还可以解释为什么有些工具确实发送正文而其他工具则不发送。

我强烈建议您重新设计您的 API,使其类似于

DELETE http://localhost:8080/api/provision/{id}
Run Code Online (Sandbox Code Playgroud)

或不同的 URI,具体取决于您的数据(资源)的设计方式