2015-10-14 287 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