【问题标题】:RestTemplate.exchange() DELETE dropping request bodyRestTemplate.exchange() DELETE 删除请求正文
【发布时间】:2016-01-12 19:05:41
【问题描述】:

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

@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 访问控制器请求映射来触发此方法时,它可以工作。但是当测试人员通过他们的集成测试触发这个方法时,或者当我使用 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() 调用中被删除了。有人见过这样的东西吗?

【问题讨论】:

  • 是删除了进入 deleteToEe 方法的主体还是在所有情况下都存在(CURL、控制器...)?
  • 从 3.0.5 版开始支持在 DELETE 方法中传递请求正文 jira.spring.io/browse/SPR-7867
  • 你也可以发布异常堆栈跟踪吗?正如@Arashsoft 所说,这应该早就得到支持了。
  • 转到邮递员顶部并打开控制台并将控制台日志添加到问题中

标签: java spring rest


【解决方案1】:

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

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

我强烈建议您将 API 重新设计为类似于

DELETE http://localhost:8080/api/provision/{id}

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

【讨论】:

  • 问题是我正在处理需求并且不确定我是否能够更改设计,因为我们正在将请求发送到需要在正文中包含某些信息的外部 api - 重新设计api 以便所有这些信息都封装在 url 中,结果是一个非常长的 url。
  • 问题是所有信息是否都应该在URI中。也许您可能有一些保存元数据的内部数据库(缓存)。无论如何,如果我理解得很好,外部 API 也需要 HTTP DELETE 中的正文。也许您可以尝试使用另一个框架(而不是 RestTemplate)来调用对这个外部 API 的 HTTP 调用。例如。简单的 Java 的 HttpUrlConnection 找出问题是否仍然存在。但我不明白问题出在客户端。这意味着 CURL 和集成测试正在丢弃 HTTP DELETE 正文,而 Postman 没有
  • 这不是这个问题的答案,它只是解释发生了什么。应该是评论。
猜你喜欢
  • 2022-01-24
  • 2018-01-26
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多