RestTemplate.exchange()DELETE删除请求体

时间:2015-10-14 15:33:58

标签: 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命中控制器请求映射来触发此方法时,它可以工作。但是当测试人员通过集成测试触发此方法时,或者当我使用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);

我打破了代码,看起来我们有一个请求机构,但出于某种原因,它是&#39;在restTemplate.exchange()调用中被删除。以前有人见过这样的事吗?

1 个答案:

答案 0 :(得分:0)

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

听起来这可能是你的情况。这也可以解释为什么有些工具会发送身体,为什么其他工具没有。

我强烈建议您将API重新设计为与

类似的内容
DELETE http://localhost:8080/api/provision/{id}

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