2015-10-14 284 views
3

我遇到一个奇怪的问题,下面的方法。RestTemplate.exchange()DELETE删除请求正文

@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); 

我breakpointed的代码,看起来像我们有一个请求主体,但由于某种原因,它被放在restTemplate.exchange()调用中。任何人之前看过类似的东西?

+0

被丢弃的是去deleteToEe身体方法还是存在于所有情况下(CURL,控制器...)? – d1x

+0

在DELETE方法中传递请求正文是从版本3.0.5开始的支持https://jira.spring.io/browse/SPR-7867 – Arashsoft

回答

0

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

听起来像这可能是你的情况。这也可以解释为什么有些工具确实发送了主体,为什么其他工具不发送主体。

我会强烈建议您向您的API类似的东西重新设计,以

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

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

+0

问题是我正在关闭需求并且不确定是否能够更改设计,因为我们发送请求到一个外部API,需要在身体中的某些信息 - 重新设计API,以便所有这些信息封装在URL中会导致一个很长的URL。 – user619804

+0

问题是,所有的信息是否应该在URI中。也许你可能有一些保存元数据的内部数据库(缓存)。无论如何,如果我理解得很好,外部API也需要HTTP DELETE身体。也许你可以试试另一个框架(而不是RestTemplate)来调用对这个外部API的HTTP调用。例如。简单的Java的HttpUrlConnection来发现问题是否存在..但我不能说这个问题在客户端。这意味着CURL和集成测试正在删除HTTP DELETE和Postman身体 – d1x

+0

这不是对这个问题的回答,它只是解释发生了什么。它应该是一个评论。 – Arashsoft