java - RestTemplate.exchange() DELETE 删除请求正文

标签 java spring rest

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

@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/

相关文章:

java - 错误 : column "id" is of type uuid but expression is of type bytea

java - 我的 thymeleaf html 表单有什么问题吗?为什么密码显示值为空?

java - 无法在两个方法内传递 try catch block 返回值

java - 从回调运行计时器时不调用 Looper.prepare()

java - 如何在 Eclipse IDE 中设置 -D java 选项?

spring - 如何从Spring Webflux Controller 捕获异常?

java - Spring Batch - 有没有办法异步执行 TaskletStep?

java - 在应用程序中维护两个不同 http 请求的 session 状态

c# - TFS REST API - 获取字段的允许值

java - 卡牌和牌组弦乐和洗牌