如何使用Spring RestTemplate发送PATCH请求

6
我需要使用Spring的RestTemplate执行 HTTP PATCH 请求调用服务。从所读到的内容来看,我需要使用execute()或exchange()方法,但我不知道如何使用它。服务调用将返回一个HTTP 200 OK状态,以及一个JSON对象,但我对此并不特别感兴趣。
非常感谢您的帮助。

我不是该主题的专家,但我认为在RestTemplate支持之前,您无法这样做。不过,您可以使用类似@RequestMapping(method = RequestMethod.PATCH)的东西。以下是一个不错的教程:http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html - rlegendi
RequestMethod 是服务器端的,但问题是关于客户端支持的。 RestTemplate 确实支持 PATCH(自 2012 年某个时间点起,https://jira.spring.io/browse/SPR-7985)。所以我真的不确定问题是什么。您尝试过某些事情(什么?),但它没有起作用(您怎么知道的?)吗? - Dave Syer
+1. 你找到这个问题的答案了吗?Lucas在下面的回答中似乎不完整,因为他示例中EmailPatch类中的所有其他实例变量都将变为null - 这不是意图。只有需要更改的实例变量应该在请求中发送。 - SGB
1个回答

6

可以使用PATCH动词,但必须使用Apache HTTP客户端库和RestTemplate类的exchange()方法。对于您来说,映射器部分可能不是必需的。下面的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);

如果EmailPatch有其他实例变量,比如说String name,string type会发生什么?在你的例子中,PATCH请求不会将它们全部更新为null吗? - SGB
它只会补丁化你发送的内容。如果EmailPatch有其他实例变量并且您没有定义它们,它将将它们设置为null。 - Lucas Holt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接