一、概述
在實際開發過程中,我們經常需要調用對方提供的接口或者自己寫的接口是否有接口。短信、天氣等)。
Java項目中調用接口的方式有:
通過JDK網絡類Java.net.HttpURLConnection;
通過common封裝好HttpClient;
通過 Apache 封裝好CloseableHttpClient;
通過SpringBoot-RestTemplate;
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
二、Java調用http接口的方式
2.1、通過JDK網絡類Java.net.HttpURLConnection
原始比較的一種調用方法,這里get請求和post請求都可以找到一個方法里面。
實現過程:
得到:
創建遠程連接
設置連接方式(get、post、put。。。)
設置連接時間
設置響應讀取時間
發起請求
獲取請求數據
關閉連接
郵政:
創建遠程連接
設置連接方式(get、post、put。。。)
設置連接時間
設置響應讀取時間
當向遠程服務器傳送數據/寫入數據時,需要設置為true(setDoOutput)
當前向遠程服務讀取數據時,設置為true,該參數可有可無(setDoInput)
設置參數格式的屬性:(請求參數)
設置鑒權信息:授權:(setRequestProperty)
參數設置
發起請求
獲取請求數據
關閉連接
直接上代碼:
?
?
package?com.riemann.springbootdemo.util.common.httpConnectionUtil; ? import?org.springframework.lang.Nullable; ? import?java.io.*; import?java.net.HttpURLConnection; import?java.net.MalformedURLException; import?java.net.URL; import?java.net.URLConnection; ? /** ?*?@author?riemann ?*/ public?class?HttpURLConnectionUtil?{ ? ????/** ?????*?Http?get請求 ?????*?@param?httpUrl?連接 ?????*?@return?響應數據 ?????*/ ????public?static?String?doGet(String?httpUrl){ ????????//鏈接 ????????HttpURLConnection?connection?=?null; ????????InputStream?is?=?null; ????????BufferedReader?br?=?null; ????????StringBuffer?result?=?new?StringBuffer(); ????????try?{ ????????????//創建連接 ????????????URL?url?=?new?URL(httpUrl); ????????????connection?=?(HttpURLConnection)?url.openConnection(); ????????????//設置請求方式 ????????????connection.setRequestMethod("GET"); ????????????//設置連接超時時間 ????????????connection.setReadTimeout(15000); ????????????//開始連接 ????????????connection.connect(); ????????????//獲取響應數據 ????????????if?(connection.getResponseCode()?==?200)?{ ????????????????//獲取返回的數據 ????????????????is?=?connection.getInputStream(); ????????????????if?(null?!=?is)?{ ????????????????????br?=?new?BufferedReader(new?InputStreamReader(is,?"UTF-8")); ????????????????????String?temp?=?null; ????????????????????while?(null?!=?(temp?=?br.readLine()))?{ ????????????????????????result.append(temp); ????????????????????} ????????????????} ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????}?finally?{ ????????????if?(null?!=?br)?{ ????????????????try?{ ????????????????????br.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????if?(null?!=?is)?{ ????????????????try?{ ????????????????????is.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????//關閉遠程連接 ????????????connection.disconnect(); ????????} ????????return?result.toString(); ????} ? ????/** ?????*?Http?post請求 ?????*?@param?httpUrl?連接 ?????*?@param?param?參數 ?????*?@return ?????*/ ????public?static?String?doPost(String?httpUrl,?@Nullable?String?param)?{ ????????StringBuffer?result?=?new?StringBuffer(); ????????//連接 ????????HttpURLConnection?connection?=?null; ????????OutputStream?os?=?null; ????????InputStream?is?=?null; ????????BufferedReader?br?=?null; ????????try?{ ????????????//創建連接對象 ????????????URL?url?=?new?URL(httpUrl); ????????????//創建連接 ????????????connection?=?(HttpURLConnection)?url.openConnection(); ????????????//設置請求方法 ????????????connection.setRequestMethod("POST"); ????????????//設置連接超時時間 ????????????connection.setConnectTimeout(15000); ????????????//設置讀取超時時間 ????????????connection.setReadTimeout(15000); ????????????//DoOutput設置是否向httpUrlConnection輸出,DoInput設置是否從httpUrlConnection讀入,此外發送post請求必須設置這兩個 ????????????//設置是否可讀取 ????????????connection.setDoOutput(true); ????????????connection.setDoInput(true); ????????????//設置通用的請求屬性 ????????????connection.setRequestProperty("accept",?"*/*"); ????????????connection.setRequestProperty("connection",?"Keep-Alive"); ????????????connection.setRequestProperty("user-agent",?"Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.1;?SV1)"); ????????????connection.setRequestProperty("Content-Type",?"application/json;charset=utf-8"); ? ????????????//拼裝參數 ????????????if?(null?!=?param?&&?param.equals(""))?{ ????????????????//設置參數 ????????????????os?=?connection.getOutputStream(); ????????????????//拼裝參數 ????????????????os.write(param.getBytes("UTF-8")); ????????????} ????????????//設置權限 ????????????//設置請求頭等 ????????????//開啟連接 ????????????//connection.connect(); ????????????//讀取響應 ????????????if?(connection.getResponseCode()?==?200)?{ ????????????????is?=?connection.getInputStream(); ????????????????if?(null?!=?is)?{ ????????????????????br?=?new?BufferedReader(new?InputStreamReader(is,?"GBK")); ????????????????????String?temp?=?null; ????????????????????while?(null?!=?(temp?=?br.readLine()))?{ ????????????????????????result.append(temp); ????????????????????????result.append(" "); ????????????????????} ????????????????} ????????????} ? ????????}?catch?(MalformedURLException?e)?{ ????????????e.printStackTrace(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????}?finally?{ ????????????//關閉連接 ????????????if(br!=null){ ????????????????try?{ ????????????????????br.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????if(os!=null){ ????????????????try?{ ????????????????????os.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????if(is!=null){ ????????????????try?{ ????????????????????is.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????//關閉連接 ????????????connection.disconnect(); ????????} ????????return?result.toString(); ????} ? ????public?static?void?main(String[]?args)?{ ????????String?message?=?doPost("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071",?""); ????????System.out.println(message); ????} }
?
?
運行結果:
2.2 通過apache通用封裝好的HttpClient
httpClient的get或post請求方式步驟:
生成一個HttpClient對象并設置相應的參數;
生成一個GetMethod對象或PostMethod并設置響應的參數;
用HttpClient生成的對象來執行GetMethod生成的Get方法;
處理響應狀態碼;
如果正常響應,處理HTTP響應內容;
釋放連接。
導入以下jar包:
?
?
???? ?commons-httpclient ????commons-httpclient ????3.1 ???? com.alibaba ????fastjson ????1.2.32
?
?
代碼如下:
?
?
package?com.riemann.springbootdemo.util.common.httpConnectionUtil; ? import?com.alibaba.fastjson.JSONObject; import?org.apache.commons.httpclient.*; import?org.apache.commons.httpclient.methods.GetMethod; import?org.apache.commons.httpclient.methods.PostMethod; import?org.apache.commons.httpclient.params.HttpMethodParams; ? import?java.io.IOException; ? /** ?*?@author?riemann ?*/ public?class?HttpClientUtil?{ ????/** ?????*?httpClient的get請求方式 ?????*?使用GetMethod來訪問一個URL對應的網頁實現步驟: ?????*?1.生成一個HttpClient對象并設置相應的參數; ?????*?2.生成一個GetMethod對象并設置響應的參數; ?????*?3.用HttpClient生成的對象來執行GetMethod生成的Get方法; ?????*?4.處理響應狀態碼; ?????*?5.若響應正常,處理HTTP響應內容; ?????*?6.釋放連接。 ?????*?@param?url ?????*?@param?charset ?????*?@return ?????*/ ????public?static?String?doGet(String?url,?String?charset)?{ ????????//1.生成HttpClient對象并設置參數 ????????HttpClient?httpClient?=?new?HttpClient(); ????????//設置Http連接超時為5秒 ????????httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); ????????//2.生成GetMethod對象并設置參數 ????????GetMethod?getMethod?=?new?GetMethod(url); ????????//設置get請求超時為5秒 ????????getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,?5000); ????????//設置請求重試處理,用的是默認的重試處理:請求三次 ????????getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,?new?DefaultHttpMethodRetryHandler()); ????????String?response?=?""; ????????//3.執行HTTP?GET?請求 ????????try?{ ????????????int?statusCode?=?httpClient.executeMethod(getMethod); ????????????//4.判斷訪問的狀態碼 ????????????if?(statusCode?!=?HttpStatus.SC_OK)?{ ????????????????System.err.println("請求出錯:"?+?getMethod.getStatusLine()); ????????????} ????????????//5.處理HTTP響應內容 ????????????//HTTP響應頭部信息,這里簡單打印 ????????????Header[]?headers?=?getMethod.getResponseHeaders(); ????????????for(Header?h?:?headers)?{ ????????????????System.out.println(h.getName()?+?"---------------"?+?h.getValue()); ????????????} ????????????//讀取HTTP響應內容,這里簡單打印網頁內容 ????????????//讀取為字節數組 ????????????byte[]?responseBody?=?getMethod.getResponseBody(); ????????????response?=?new?String(responseBody,?charset); ????????????System.out.println("-----------response:"?+?response); ????????????//讀取為InputStream,在網頁內容數據量大時候推薦使用 ????????????//InputStream?response?=?getMethod.getResponseBodyAsStream(); ????????}?catch?(HttpException?e)?{ ????????????//發生致命的異常,可能是協議不對或者返回的內容有問題 ????????????System.out.println("請檢查輸入的URL!"); ????????????e.printStackTrace(); ????????}?catch?(IOException?e)?{ ????????????//發生網絡異常 ????????????System.out.println("發生網絡異常!"); ????????}?finally?{ ????????????//6.釋放連接 ????????????getMethod.releaseConnection(); ????????} ????????return?response; ????} ? ????/** ?????*?post請求 ?????*?@param?url ?????*?@param?json ?????*?@return ?????*/ ????public?static?String?doPost(String?url,?JSONObject?json){ ????????HttpClient?httpClient?=?new?HttpClient(); ????????PostMethod?postMethod?=?new?PostMethod(url); ? ????????postMethod.addRequestHeader("accept",?"*/*"); ????????postMethod.addRequestHeader("connection",?"Keep-Alive"); ????????//設置json格式傳送 ????????postMethod.addRequestHeader("Content-Type",?"application/json;charset=GBK"); ????????//必須設置下面這個Header ????????postMethod.addRequestHeader("User-Agent",?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/58.0.3029.81?Safari/537.36"); ????????//添加請求參數 ????????postMethod.addParameter("commentId",?json.getString("commentId")); ? ????????String?res?=?""; ????????try?{ ????????????int?code?=?httpClient.executeMethod(postMethod); ????????????if?(code?==?200){ ????????????????res?=?postMethod.getResponseBodyAsString(); ????????????????System.out.println(res); ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????????return?res; ????} ? ????public?static?void?main(String[]?args)?{ ????????System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071",?"GBK")); ????????System.out.println("-----------分割線------------"); ????????System.out.println("-----------分割線------------"); ????????System.out.println("-----------分割線------------"); ? ????????JSONObject?jsonObject?=?new?JSONObject(); ????????jsonObject.put("commentId",?"13026194071"); ????????System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071",?jsonObject)); ????} }
?
?
運行結果:
post請求的jsonObject參數也成功寫入
2.3 通過Apache封裝好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基礎上修改可以更新而來的,這里還涉及到請求頭的設置(請求),利用fastjson轉換請求或返回請求結果字符串為json格式,當然方式也是設置頭token、 json的,這里只在下面說明。
導入以下jar包:
?
?
???? ?org.apache.httpcomponents ????httpclient ????4.5.2 ???? com.alibaba ????fastjson ????1.2.32
?
?
代碼如下:
?
?
package?com.riemann.springbootdemo.util.common.httpConnectionUtil; ? import?com.alibaba.fastjson.JSONObject; import?org.apache.http.HttpResponse; import?org.apache.http.HttpStatus; import?org.apache.http.client.methods.CloseableHttpResponse; import?org.apache.http.client.methods.HttpGet; import?org.apache.http.client.methods.HttpPost; import?org.apache.http.entity.StringEntity; import?org.apache.http.impl.client.CloseableHttpClient; import?org.apache.http.impl.client.HttpClientBuilder; import?org.apache.http.util.EntityUtils; ? import?java.io.IOException; import?java.io.UnsupportedEncodingException; ? /** ?*?@author?riemann ?*/ public?class?CloseableHttpClientUtil?{ ? ????private?static?String?tokenString?=?""; ????private?static?String?AUTH_TOKEN_EXPIRED?=?"AUTH_TOKEN_EXPIRED"; ????private?static?CloseableHttpClient?httpClient?=?null; ? ????/** ?????*?以get方式調用第三方接口 ?????*?@param?url ?????*?@param?token ?????*?@return ?????*/ ????public?static?String?doGet(String?url,?String?token)?{ ????????//創建HttpClient對象 ????????CloseableHttpClient?httpClient?=?HttpClientBuilder.create().build(); ????????HttpGet?httpGet?=?new?HttpGet(url); ????????if?(null?!=?tokenString?&&?!tokenString.equals(""))?{ ????????????tokenString?=?getToken(); ????????} ????????//api_gateway_auth_token自定義header頭,用于token驗證使用 ????????httpGet.addHeader("api_gateway_auth_token",tokenString); ????????httpGet.addHeader("User-Agent",?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/58.0.3029.81?Safari/537.36"); ????????try?{ ????????????HttpResponse?response?=?httpClient.execute(httpGet); ????????????if?(response.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK)?{ ????????????????//返回json格式 ????????????????String?res?=?EntityUtils.toString(response.getEntity()); ????????????????return?res; ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????????return?null; ????} ? ????/** ?????*?以post方式調用第三方接口 ?????*?@param?url ?????*?@param?json ?????*?@return ?????*/ ????public?static?String?doPost(String?url,?JSONObject?json)?{ ????????if?(null?==?httpClient)?{ ????????????httpClient?=?HttpClientBuilder.create().build(); ????????} ????????HttpPost?httpPost?=?new?HttpPost(url); ????????if?(null?!=?tokenString?&&?tokenString.equals(""))?{ ????????????tokenString?=?getToken(); ????????} ????????//api_gateway_auth_token自定義header頭,用于token驗證使用 ????????httpPost.addHeader("api_gateway_auth_token",?tokenString); ????????httpPost.addHeader("User-Agent",?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/58.0.3029.81?Safari/537.36"); ????????try?{ ????????????StringEntity?se?=?new?StringEntity(json.toString()); ????????????se.setContentEncoding("UTF-8"); ????????????//發送json數據需要設置contentType ????????????se.setContentType("application/x-www-form-urlencoded"); ????????????//設置請求參數 ????????????httpPost.setEntity(se); ????????????HttpResponse?response?=?httpClient.execute(httpPost); ????????????if?(response.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK)?{ ????????????????//返回json格式 ????????????????String?res?=?EntityUtils.toString(response.getEntity()); ????????????????return?res; ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????}?finally?{ ????????????if?(httpClient?!=?null){ ????????????????try?{ ????????????????????httpClient.close(); ????????????????}?catch?(IOException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????} ????????return?null; ????} ? ????/** ?????*?獲取第三方接口的token ?????*/ ????public?static?String?getToken()?{ ????????String?token?=?""; ????????JSONObject?object?=?new?JSONObject(); ????????object.put("appid",?"appid"); ????????object.put("secretkey",?"secretkey"); ????????if?(null?==?httpClient)?{ ????????????httpClient?=?HttpClientBuilder.create().build(); ????????} ????????HttpPost?httpPost?=?new?HttpPost("http://localhost/login"); ????????httpPost.addHeader("User-Agent",?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/58.0.3029.81?Safari/537.36"); ????????try?{ ????????????StringEntity?se?=?new?StringEntity(object.toString()); ????????????se.setContentEncoding("UTF-8"); ????????????//發送json數據需要設置contentType ????????????se.setContentType("application/x-www-form-urlencoded"); ????????????//設置請求參數 ????????????httpPost.setEntity(se); ????????????HttpResponse?response?=?httpClient.execute(httpPost); ????????????//這里可以把返回的結果按照自定義的返回數據結果,把string轉換成自定義類 ????????????//ResultTokenBO?result?=?JSONObject.parseObject(response,?ResultTokenBO.class); ????????????//把response轉為jsonObject ????????????JSONObject?result?=?(JSONObject)?JSONObject.parseObject(String.valueOf(response)); ????????????if?(result.containsKey("token"))?{ ????????????????token?=?result.getString("token"); ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????????return?token; ????} ? ????/** ?????*?測試 ?????*/ ????public?static?void?test(String?telephone)?{ ? ????????JSONObject?object?=?new?JSONObject(); ????????object.put("telephone",?telephone); ? ????????//首先獲取token ????????tokenString?=?getToken(); ????????String?response?=?doPost("http://localhost/searchUrl",?object); ????????//如果返回的結果是list形式的,需要使用JSONObject.parseArray轉換 ????????//List?list?=?JSONObject.parseArray(response,?Result.class); ????????System.out.println(response); ????} ? ????public?static?void?main(String[]?args)?{ ????????test("12345678910"); ????} }
?
?
2.4 通過SpringBoot-RestTemplate
springBoot-RestTemple是這些代碼的集合的大成者,編寫簡單,目前可以采用的調用接口有:
delete() HTTP DELETE在特定操作的 URL 上對資源執行
exchange() 在URL上執行特定的HTTP方法,返回包含對象的ResponseEntity,這個對象是從請求體中映射到的
execute() 在上執行特定的HTTP方法,返回一個從響應體映射到的對象
get) 發送一個HTTP GET請求返回的ResponseEntity包含了響應體,映射成的對象
getForObject() 發送HTTP GET請求,返回的請求體將映射為一個對象
postForEntity() POST 數據到一個URL,返回包含一個對象的ResponseEntity,這個對象是從響應體中映射的
postForObject() POST 數據到一個 URL,返回根據響應體形成的對象
headForHeaders() 發送HTTP HEAD請求,返回包含特定資源URL的HTTP頭
optionsForAllow() 發送HTTP OPTIONS請求,返回對特定URL的Allow頭信息
postForLocation() POST 數據到一個 URL,返回新創建資源的 URL
put() PUT 資源到特定的 URL
首先導入springboot的web包
?
?
???????? ? ????org.springframework.boot ????????spring-boot-starter-parent ????????2.0.4.RELEASE ???????????? ???????? ???????????? ? ???????? ???????? ????????org.apache.httpcomponents ????????????httpclient ????????????4.5.2 ???????????????????? ????????org.springframework.boot ????????????spring-boot-configuration-processor ????????????true ???????????????????? ????????org.springframework.boot ????????????spring-boot-starter-aop ???????????????????? ????????org.springframework.boot ????????????spring-boot-starter-web ???????????????????????????? ???????????????????????????? ????????????org.springframework.boot ????????????????????spring-boot-starter-tomcat ???????????????????????????? ????????org.springframework.boot ????????????spring-boot-starter-jetty ???????????????????? ????org.springframework.boot ????????????spring-boot-starter-test ????????????test ????????
?
?
在啟動類同包下創建RestTemplateConfig.java類
?
?
import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.Configuration; import?org.springframework.http.client.ClientHttpRequestFactory; import?org.springframework.http.client.SimpleClientHttpRequestFactory; import?org.springframework.web.client.RestTemplate; ? /** ?*?@author?riemann ?*/ @Configuration public?class?RestTemplateConfig?{ ? ????@Bean ????public?RestTemplate?restTemplate(ClientHttpRequestFactory?factory){ ????????return?new?RestTemplate(factory); ????} ? ????@Bean ????public?ClientHttpRequestFactory?simpleClientHttpRequestFactory(){ ????????SimpleClientHttpRequestFactory?factory?=?new?SimpleClientHttpRequestFactory(); ????????factory.setConnectTimeout(15000); ????????factory.setReadTimeout(5000); ????????return?factory; ????} }
?
?
然后在Service類(RestTemplateToInterface)中注入使用
具體代碼如下:
?
?
import?com.alibaba.fastjson.JSONObject; import?com.swordfall.model.User; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.http.*; import?org.springframework.stereotype.Service; import?org.springframework.web.client.RestTemplate; ? /** ?*?@author?riemann ?*/ @Service public?class?RestTemplateToInterface?{ ? ????@Autowired ????private?RestTemplate?restTemplate; ? ????/** ?????*?以get方式請求第三方http接口?getForEntity ?????*?@param?url ?????*?@return ?????*/ ????public?User?doGetWith1(String?url){ ????????ResponseEntity?responseEntity?=?restTemplate.getForEntity(url,?User.class); ????????User?user?=?responseEntity.getBody(); ????????return?user; ????} ? ????/** ?????*?以get方式請求第三方http接口?getForObject ?????*?返回值返回的是響應體,省去了我們再去getBody() ?????*?@param?url ?????*?@return ?????*/ ????public?User?doGetWith2(String?url){ ????????User?user??=?restTemplate.getForObject(url,?User.class); ????????return?user; ????} ? ????/** ?????*?以post方式請求第三方http接口?postForEntity ?????*?@param?url ?????*?@return ?????*/ ????public?String?doPostWith1(String?url){ ????????User?user?=?new?User("小白",?20); ????????ResponseEntity ?responseEntity?=?restTemplate.postForEntity(url,?user,?String.class); ????????String?body?=?responseEntity.getBody(); ????????return?body; ????} ? ????/** ?????*?以post方式請求第三方http接口?postForEntity ?????*?@param?url ?????*?@return ?????*/ ????public?String?doPostWith2(String?url){ ????????User?user?=?new?User("小白",?20); ????????String?body?=?restTemplate.postForObject(url,?user,?String.class); ????????return?body; ????} ? ????/** ?????*?exchange ?????*?@return ?????*/ ????public?String?doExchange(String?url,?Integer?age,?String?name){ ????????//header參數 ????????HttpHeaders?headers?=?new?HttpHeaders(); ????????String?token?=?"asdfaf2322"; ????????headers.add("authorization",?token); ????????headers.setContentType(MediaType.APPLICATION_JSON); ? ????????//放入body中的json參數 ????????JSONObject?obj?=?new?JSONObject(); ????????obj.put("age",?age); ????????obj.put("name",?name); ? ????????//組裝 ????????HttpEntity ?request?=?new?HttpEntity<>(obj,?headers); ????????ResponseEntity ?responseEntity?=?restTemplate.exchange(url,?HttpMethod.POST,?request,?String.class); ????????String?body?=?responseEntity.getBody(); ????????return?body; ????} }
?
?
2.5 通過okhttp
現在也是蠻流行的,基于手機端很火的,這里分享一下OkHttpClient客戶端,業務代碼get、post請求直接調用http就好了。
pom文件引入依賴包
?
?
???? @Slf4j public?class?OkHttpClient?{ ????private?static?final?MediaType?JSON?=?MediaType.parse("application/json;?charset=utf-8"); ? ????private?volatile?static?okhttp3.OkHttpClient?client; ? ????private?static?final?int?MAX_IDLE_CONNECTION?=?Integer ????????????.parseInt(ConfigManager.get("httpclient.max_idle_connection")); ? ????private?static?final?long?KEEP_ALIVE_DURATION?=?Long ????????????.parseLong(ConfigManager.get("httpclient.keep_alive_duration")); ? ????private?static?final?long?CONNECT_TIMEOUT?=?Long.parseLong(ConfigManager.get("httpclient.connectTimeout")); ? ????private?static?final?long?READ_TIMEOUT?=?Long.parseLong(ConfigManager.get("httpclient.?")); ? ????/** ?????*?單例模式(雙重檢查模式)?獲取類實例 ?????* ?????*?@return?client ?????*/ ????private?static?okhttp3.OkHttpClient?getInstance()?{ ????????if?(client?==?null)?{ ????????????synchronized?(okhttp3.OkHttpClient.class)?{ ????????????????if?(client?==?null)?{ ????????????????????client?=?new?okhttp3.OkHttpClient.Builder() ????????????????????????????.connectTimeout(CONNECT_TIMEOUT,?TimeUnit.SECONDS) ????????????????????????????.readTimeout(READ_TIMEOUT,?TimeUnit.SECONDS) ????????????????????????????.connectionPool(new?ConnectionPool(MAX_IDLE_CONNECTION,?KEEP_ALIVE_DURATION, ????????????????????????????????????TimeUnit.MINUTES)) ????????????????????????????.build(); ????????????????} ????????????} ????????} ????????return?client; ????} ? ????public?static?String?syncPost(String?url,?String?json)?throws?IOException?{ ????????RequestBody?body?=?RequestBody.create(JSON,?json); ????????Request?request?=?new?Request.Builder() ????????????????.url(url) ????????????????.post(body) ????????????????.build(); ????????try?{ ????????????Response?response?=?OkHttpClient.getInstance().newCall(request).execute(); ????????????if?(response.isSuccessful())?{ ????????????????String?result?=?response.body().string(); ????????????????log.info("syncPost?response?=?{},?responseBody=?{}",?response,?result); ????????????????return?result; ????????????} ????????????String?result?=?response.body().string(); ????????????log.info("syncPost?response?=?{},?responseBody=?{}",?response,?result); ????????????throw?new?IOException("三方接口返回http狀態碼為"?+?response.code()); ????????}?catch?(Exception?e)?{ ????????????log.error("syncPost()?url:{}?have?a?ecxeption?{}",?url,?e); ????????????throw?new?RuntimeException("syncPost()?have?a?ecxeption?{}"?+?e.getMessage()); ????????} ????} ? ????public?static?String?syncGet(String?url,?Mapcom.squareup.okhttp3 ????okhttp ????3.10.0 ?headParamsMap)?throws?IOException?{ ????????Request?request; ????????final?Request.Builder?builder?=?new?Request.Builder().url(url); ????????try?{ ????????????if?(!CollectionUtils.isEmpty(headParamsMap))?{ ????????????????final?Iterator >?iterator?=?headParamsMap.entrySet() ????????????????????????.iterator(); ????????????????while?(iterator.hasNext())?{ ????????????????????final?Map.Entry ?entry?=?iterator.next(); ????????????????????builder.addHeader(entry.getKey(),?(String)?entry.getValue()); ????????????????} ????????????} ????????????request?=?builder.build(); ????????????Response?response?=?OkHttpClient.getInstance().newCall(request).execute(); ????????????String?result?=?response.body().string(); ????????????log.info("syncGet?response?=?{},responseBody=?{}",?response,?result); ????????????if?(!response.isSuccessful())?{ ????????????????throw?new?IOException("三方接口返回http狀態碼為"?+?response.code()); ????????????} ????????????return?result; ????????}?catch?(Exception?e)?{ ????????????log.error("remote?interface?url:{}?have?a?ecxeption?{}",?url,?e); ????????????throw?new?RuntimeException("三方接口返回異常"); ????????} ????} ? }
?
?
編輯:黃飛
評論