我在使用下面的方法时遇到了一个奇怪的问题。
@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();
}
当我通过 Postman 命中 Controller 请求映射来触发此方法时,它起作用了。但是当测试人员通过他们的集成测试触发这个方法时,或者当我使用 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
我在代码中的这一点得到一个空指针异常
result = restTemplate.exchange(targetUrl, HttpMethod.DELETE, request, String.class);
我已经断点了代码,看起来我们有一个请求正文,但由于某种原因,它在 restTemplate.exchange() 调用中被删除。以前有人见过这样的吗?
最佳答案
使用 HTTP DELETE 方法时,请求中不应包含任何正文。许多框架不鼓励使用它或警告您 body 可能会被丢弃。原因是您想删除一些由您的 URI 标识的资源,因此不需要正文。
听起来这可能是你的情况。它还可以解释为什么有些工具会发送尸体而其他工具不会。
我强烈建议您将 API 重新设计为类似于
DELETE http://localhost:8080/api/provision/{id}
或不同的 URI 取决于您的数据(资源)的设计方式
关于java - RestTemplate.exchange() DELETE 删除请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33129634/