之前的開發過程中遇到過各種各樣的接口對接,有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>
測試已經搞定!