我使用下面的方法遇到了一个奇怪的问题。
@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() 调用中被删除。有人见过这样的事情吗?
使用 HTTP DELETE 方法时,请求中不应包含任何正文。许多框架不鼓励使用它或警告您主体可能会被丢弃。原因是您想要删除由 URI 标识的某些资源,因此不需要正文。
听起来这可能就是你的情况。它还可以解释为什么有些工具确实发送正文而其他工具则不发送。
我强烈建议您重新设计您的 API,使其类似于
DELETE http://localhost:8080/api/provision/{id}
Run Code Online (Sandbox Code Playgroud)
或不同的 URI,具体取决于您的数据(资源)的设计方式
| 归档时间: |
|
| 查看次数: |
14756 次 |
| 最近记录: |