Invalid HTTP method: PATCH在使用RestTemplate的異常解決

之前的開發過程中遇到過各種各樣的接口對接,有WebService也有Restful的接口,通訊方式也是多種多樣。

對於模擬HTTP請求,一直是使用HttpClient的。這裏順便普及一下Http請求的幾個方法:

(1)GET:通過請求URI得到資源

(2)POST:用於添加新的內容

(3)PUT:用於修改某個內容,若不存在則添加

(4)DELETE:刪除某個內容

(5)OPTIONS :詢問可以執行哪些方法

(6)HEAD :類似於GET, 但是不返回body信息,用於檢查對象是否存在,以及得到對象的元數據

(7)CONNECT :用於代理進行傳輸,如使用SSL

(8)TRACE:用於遠程診斷服務器

  

最近的幾個項目都開始使用SpringBoot了,突然想到Spring全家桶裏面會不會有一種代碼習慣更貼近Spring體系的接口交互的方式?

簡單的使用搜索引擎查找一下,就找到了RestTemplate

RestTemplate:Spring基於HttpClient封裝開發的一個客戶端編程工具包,遵循命名約定習慣,方法名由 Http方法 + 返回對象類型 組成。

public JSONObjectgetAccountByPhone(String phone) {
    long timestamp = System.currentTimeMillis() /1000;
    String sign = getSign(timestamp);
    ResponseEntity responseEntity =restTemplate.getForEntity(colour.getHost() + ColourUrl.USER_QUERY +"?ts=" + timestamp +"&sign=" + sign +"&appID=" +colour.getAppId() +"&access_token=" + getAccessToken(timestamp, sign) +"&mobile=" + phone, JSONObject.class);
    return responseEntity.getBody().getJSONObject("content");
}

在實際開發過程中,在利用到PATCH方法時會拋出錯誤:

org.springframework.web.client.ResourceAccessException: I/O error on PATCH request for "http://localhost:8080/test":
Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH

查閱一翻資料之後發現,RestTemplate工廠類的默認實現中,不支持使用PATCH方法,需要將RestTemplate配置類的工廠對象修改爲HttpComponentsClientHttpRequestFactory,這

public class RestTemplateConfig {
 
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }
 
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
//       SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory();
//      上一行被註釋掉的是Spring自己的實現,下面是依賴了httpclient包後的實現
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(5000);
        return factory;
    }
}

另外,你可能還需要引入httpclient的依賴

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4.1</version>
</dependency>

測試已經搞定!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章