2014-01-28 152 views
4

我需要使用Spring的RestTemplate使用HTTP PATCH動詞來調用服務。從我讀到的,我需要使用execute()或exchange()方法,但我不知道如何使用它。該服務調用返回一個HTTP 200 OK狀態,以及一個我不特別感興趣的JSON對象。如何製作Spring RestTemplate PATCH請求

任何幫助將不勝感激謝謝。

+0

我不是這個話題的專家,但我認爲你不能這樣做,直到RestTemplate支持它。你可以做的是使用'@RequestMapping(method = RequestMethod.PATCH)'。這裏有一個很好的教程,如何開始:http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html – rlegendi

+0

RequestMethod是服務器端,但問題是關於客戶端支持。 'RestTemplate'不支持PATCH(截至2012年的某個時候,https://jira.spring.io/browse/SPR-7985)。所以我不確定問題是什麼。你嘗試過什麼(什麼?),但它不起作用(你怎麼知道的?)? –

+0

+1。你有沒有找到這個問題的答案。 Lucas的答案似乎並不完整,因爲在他的例子中,EmailPatch類中的所有其他實例變量都將變爲null - 這不是意圖。只有需要改變的實例變量應該在請求中發送。 – SGB

回答

3

可以使用PATCH動詞,但必須使用帶有Exchange()的RestTemplate類的Apache HTTP客戶端庫。映射器部分可能不是您必需的。下面的EmailPatch類只包含我們想要在請求中更新的字段。

ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.registerModule(new Jackson2HalModule()); 

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json")); 
    converter.setObjectMapper(mapper); 

    HttpClient httpClient = HttpClients.createDefault(); 
    RestTemplate restTemplate = new RestTemplate(Collections.<HttpMessageConverter<?>> singletonList(converter)); 
    restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)); 
    EmailPatch patch = new EmailPatch(); 
    patch.setStatus(1); 
    ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<EmailPatch>(patch), 
        String.class); 
+0

如果EmailPatch具有其他實例變量,例如發生什麼情況;字符串名稱,字符串類型?在你的例子中,PATCH請求不會將它們全部更新爲null嗎? – SGB

+0

它只會修補你發送的內容。如果EmailPatch具有其他實例變量並且您沒有定義它們,它會將它們設置爲null。 –