Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java restemplate.exchange()删除请求正文_Java_Spring_Rest - Fatal编程技术网

Java restemplate.exchange()删除请求正文

Java restemplate.exchange()删除请求正文,java,spring,rest,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);

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

@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();
}
我在代码的这一点上得到一个空指针异常

result = restTemplate.exchange(targetUrl, HttpMethod.DELETE, request, String.class);

我已经中断了代码,看起来我们有一个请求主体,但由于某种原因,它在restemplate.exchange()调用中被删除。以前有人见过类似的情况吗?

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

听起来这可能是你的情况。这也解释了为什么有些工具确实能传送身体,而有些工具却不能

我强烈建议您将API重新设计为类似的内容

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

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

问题是我正在根据需求工作,不确定是否能够更改设计,当我们将请求发送到一个外部api时,该api需要正文中的某些信息——重新设计api,以便将所有这些信息封装在url中,结果将是一个非常长的url。问题是所有信息是否都应该在URI中。可能您有一些内部数据库(缓存)保存元数据。无论如何,如果我理解得很好,外部API也需要HTTP DELETE中的body。也许您可以尝试使用另一个框架(而不是RestTemplate)来调用此ExtAPI的HTTP调用。例如,使用simple Java的HttpUrlConnection查找问题是否仍然存在。。但我不相信问题在于客户。这意味着CURL和integration测试正在删除HTTP删除的主体,而Postman没有。这并不是对这个问题的回答,它只是解释了发生了什么。它应该是一个注释。是否删除了去deleteToEe方法的主体,或者它是否在所有情况下都存在(CURL、controller…)?在DELETE方法中传递请求主体是3.0.5版的支持。您还可以发布异常stacktrace吗?正如@Arashsoft所说的,这在很久以前就应该得到支持了。转到postman top并打开控制台,将控制台日志添加到问题中
DELETE http://localhost:8080/api/provision/{id}