一、概述
在實(shí)際開發(fā)過程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或者自己寫的接口是否有接口。短信、天氣等)。
Java項(xiàng)目中調(diào)用接口的方式有:
通過JDK網(wǎng)絡(luò)類Java.net.HttpURLConnection;
通過common封裝好HttpClient;
通過 Apache 封裝好CloseableHttpClient;
通過SpringBoot-RestTemplate;
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
二、Java調(diào)用http接口的方式
2.1、通過JDK網(wǎng)絡(luò)類Java.net.HttpURLConnection
原始比較的一種調(diào)用方法,這里get請(qǐng)求和post請(qǐng)求都可以找到一個(gè)方法里面。
實(shí)現(xiàn)過程:
得到:
創(chuàng)建遠(yuǎn)程連接
設(shè)置連接方式(get、post、put。。。)
設(shè)置連接時(shí)間
設(shè)置響應(yīng)讀取時(shí)間
發(fā)起請(qǐng)求
獲取請(qǐng)求數(shù)據(jù)
關(guān)閉連接
郵政:
創(chuàng)建遠(yuǎn)程連接
設(shè)置連接方式(get、post、put。。。)
設(shè)置連接時(shí)間
設(shè)置響應(yīng)讀取時(shí)間
當(dāng)向遠(yuǎn)程服務(wù)器傳送數(shù)據(jù)/寫入數(shù)據(jù)時(shí),需要設(shè)置為true(setDoOutput)
當(dāng)前向遠(yuǎn)程服務(wù)讀取數(shù)據(jù)時(shí),設(shè)置為true,該參數(shù)可有可無(setDoInput)
設(shè)置參數(shù)格式的屬性:(請(qǐng)求參數(shù))
設(shè)置鑒權(quán)信息:授權(quán):(setRequestProperty)
參數(shù)設(shè)置
發(fā)起請(qǐng)求
獲取請(qǐng)求數(shù)據(jù)
關(guān)閉連接
直接上代碼:
?
?
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請(qǐng)求 ?????*?@param?httpUrl?連接 ?????*?@return?響應(yīng)數(shù)據(jù) ?????*/ ????public?static?String?doGet(String?httpUrl){ ????????//鏈接 ????????HttpURLConnection?connection?=?null; ????????InputStream?is?=?null; ????????BufferedReader?br?=?null; ????????StringBuffer?result?=?new?StringBuffer(); ????????try?{ ????????????//創(chuàng)建連接 ????????????URL?url?=?new?URL(httpUrl); ????????????connection?=?(HttpURLConnection)?url.openConnection(); ????????????//設(shè)置請(qǐng)求方式 ????????????connection.setRequestMethod("GET"); ????????????//設(shè)置連接超時(shí)時(shí)間 ????????????connection.setReadTimeout(15000); ????????????//開始連接 ????????????connection.connect(); ????????????//獲取響應(yīng)數(shù)據(jù) ????????????if?(connection.getResponseCode()?==?200)?{ ????????????????//獲取返回的數(shù)據(jù) ????????????????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(); ????????????????} ????????????} ????????????//關(guān)閉遠(yuǎn)程連接 ????????????connection.disconnect(); ????????} ????????return?result.toString(); ????} ? ????/** ?????*?Http?post請(qǐng)求 ?????*?@param?httpUrl?連接 ?????*?@param?param?參數(shù) ?????*?@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?{ ????????????//創(chuàng)建連接對(duì)象 ????????????URL?url?=?new?URL(httpUrl); ????????????//創(chuàng)建連接 ????????????connection?=?(HttpURLConnection)?url.openConnection(); ????????????//設(shè)置請(qǐng)求方法 ????????????connection.setRequestMethod("POST"); ????????????//設(shè)置連接超時(shí)時(shí)間 ????????????connection.setConnectTimeout(15000); ????????????//設(shè)置讀取超時(shí)時(shí)間 ????????????connection.setReadTimeout(15000); ????????????//DoOutput設(shè)置是否向httpUrlConnection輸出,DoInput設(shè)置是否從httpUrlConnection讀入,此外發(fā)送post請(qǐng)求必須設(shè)置這兩個(gè) ????????????//設(shè)置是否可讀取 ????????????connection.setDoOutput(true); ????????????connection.setDoInput(true); ????????????//設(shè)置通用的請(qǐng)求屬性 ????????????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"); ? ????????????//拼裝參數(shù) ????????????if?(null?!=?param?&&?param.equals(""))?{ ????????????????//設(shè)置參數(shù) ????????????????os?=?connection.getOutputStream(); ????????????????//拼裝參數(shù) ????????????????os.write(param.getBytes("UTF-8")); ????????????} ????????????//設(shè)置權(quán)限 ????????????//設(shè)置請(qǐng)求頭等 ????????????//開啟連接 ????????????//connection.connect(); ????????????//讀取響應(yīng) ????????????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?{ ????????????//關(guān)閉連接 ????????????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(); ????????????????} ????????????} ????????????//關(guān)閉連接 ????????????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); ????} }
?
?
運(yùn)行結(jié)果:
2.2 通過apache通用封裝好的HttpClient
httpClient的get或post請(qǐng)求方式步驟:
生成一個(gè)HttpClient對(duì)象并設(shè)置相應(yīng)的參數(shù);
生成一個(gè)GetMethod對(duì)象或PostMethod并設(shè)置響應(yīng)的參數(shù);
用HttpClient生成的對(duì)象來執(zhí)行GetMethod生成的Get方法;
處理響應(yīng)狀態(tài)碼;
如果正常響應(yīng),處理HTTP響應(yīng)內(nèi)容;
釋放連接。
導(dǎo)入以下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請(qǐng)求方式 ?????*?使用GetMethod來訪問一個(gè)URL對(duì)應(yīng)的網(wǎng)頁實(shí)現(xiàn)步驟: ?????*?1.生成一個(gè)HttpClient對(duì)象并設(shè)置相應(yīng)的參數(shù); ?????*?2.生成一個(gè)GetMethod對(duì)象并設(shè)置響應(yīng)的參數(shù); ?????*?3.用HttpClient生成的對(duì)象來執(zhí)行GetMethod生成的Get方法; ?????*?4.處理響應(yīng)狀態(tài)碼; ?????*?5.若響應(yīng)正常,處理HTTP響應(yīng)內(nèi)容; ?????*?6.釋放連接。 ?????*?@param?url ?????*?@param?charset ?????*?@return ?????*/ ????public?static?String?doGet(String?url,?String?charset)?{ ????????//1.生成HttpClient對(duì)象并設(shè)置參數(shù) ????????HttpClient?httpClient?=?new?HttpClient(); ????????//設(shè)置Http連接超時(shí)為5秒 ????????httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); ????????//2.生成GetMethod對(duì)象并設(shè)置參數(shù) ????????GetMethod?getMethod?=?new?GetMethod(url); ????????//設(shè)置get請(qǐng)求超時(shí)為5秒 ????????getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,?5000); ????????//設(shè)置請(qǐng)求重試處理,用的是默認(rèn)的重試處理:請(qǐng)求三次 ????????getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,?new?DefaultHttpMethodRetryHandler()); ????????String?response?=?""; ????????//3.執(zhí)行HTTP?GET?請(qǐng)求 ????????try?{ ????????????int?statusCode?=?httpClient.executeMethod(getMethod); ????????????//4.判斷訪問的狀態(tài)碼 ????????????if?(statusCode?!=?HttpStatus.SC_OK)?{ ????????????????System.err.println("請(qǐng)求出錯(cuò):"?+?getMethod.getStatusLine()); ????????????} ????????????//5.處理HTTP響應(yīng)內(nèi)容 ????????????//HTTP響應(yīng)頭部信息,這里簡(jiǎn)單打印 ????????????Header[]?headers?=?getMethod.getResponseHeaders(); ????????????for(Header?h?:?headers)?{ ????????????????System.out.println(h.getName()?+?"---------------"?+?h.getValue()); ????????????} ????????????//讀取HTTP響應(yīng)內(nèi)容,這里簡(jiǎn)單打印網(wǎng)頁內(nèi)容 ????????????//讀取為字節(jié)數(shù)組 ????????????byte[]?responseBody?=?getMethod.getResponseBody(); ????????????response?=?new?String(responseBody,?charset); ????????????System.out.println("-----------response:"?+?response); ????????????//讀取為InputStream,在網(wǎng)頁內(nèi)容數(shù)據(jù)量大時(shí)候推薦使用 ????????????//InputStream?response?=?getMethod.getResponseBodyAsStream(); ????????}?catch?(HttpException?e)?{ ????????????//發(fā)生致命的異常,可能是協(xié)議不對(duì)或者返回的內(nèi)容有問題 ????????????System.out.println("請(qǐng)檢查輸入的URL!"); ????????????e.printStackTrace(); ????????}?catch?(IOException?e)?{ ????????????//發(fā)生網(wǎng)絡(luò)異常 ????????????System.out.println("發(fā)生網(wǎng)絡(luò)異常!"); ????????}?finally?{ ????????????//6.釋放連接 ????????????getMethod.releaseConnection(); ????????} ????????return?response; ????} ? ????/** ?????*?post請(qǐng)求 ?????*?@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"); ????????//設(shè)置json格式傳送 ????????postMethod.addRequestHeader("Content-Type",?"application/json;charset=GBK"); ????????//必須設(shè)置下面這個(gè)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"); ????????//添加請(qǐng)求參數(shù) ????????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)); ????} }
?
?
運(yùn)行結(jié)果:
post請(qǐng)求的jsonObject參數(shù)也成功寫入
2.3 通過Apache封裝好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基礎(chǔ)上修改可以更新而來的,這里還涉及到請(qǐng)求頭的設(shè)置(請(qǐng)求),利用fastjson轉(zhuǎn)換請(qǐng)求或返回請(qǐng)求結(jié)果字符串為json格式,當(dāng)然方式也是設(shè)置頭token、 json的,這里只在下面說明。
導(dǎo)入以下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方式調(diào)用第三方接口 ?????*?@param?url ?????*?@param?token ?????*?@return ?????*/ ????public?static?String?doGet(String?url,?String?token)?{ ????????//創(chuàng)建HttpClient對(duì)象 ????????CloseableHttpClient?httpClient?=?HttpClientBuilder.create().build(); ????????HttpGet?httpGet?=?new?HttpGet(url); ????????if?(null?!=?tokenString?&&?!tokenString.equals(""))?{ ????????????tokenString?=?getToken(); ????????} ????????//api_gateway_auth_token自定義header頭,用于token驗(yàn)證使用 ????????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方式調(diào)用第三方接口 ?????*?@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驗(yàn)證使用 ????????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"); ????????????//發(fā)送json數(shù)據(jù)需要設(shè)置contentType ????????????se.setContentType("application/x-www-form-urlencoded"); ????????????//設(shè)置請(qǐng)求參數(shù) ????????????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"); ????????????//發(fā)送json數(shù)據(jù)需要設(shè)置contentType ????????????se.setContentType("application/x-www-form-urlencoded"); ????????????//設(shè)置請(qǐng)求參數(shù) ????????????httpPost.setEntity(se); ????????????HttpResponse?response?=?httpClient.execute(httpPost); ????????????//這里可以把返回的結(jié)果按照自定義的返回?cái)?shù)據(jù)結(jié)果,把string轉(zhuǎn)換成自定義類 ????????????//ResultTokenBO?result?=?JSONObject.parseObject(response,?ResultTokenBO.class); ????????????//把response轉(zhuǎn)為jsonObject ????????????JSONObject?result?=?(JSONObject)?JSONObject.parseObject(String.valueOf(response)); ????????????if?(result.containsKey("token"))?{ ????????????????token?=?result.getString("token"); ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????????return?token; ????} ? ????/** ?????*?測(cè)試 ?????*/ ????public?static?void?test(String?telephone)?{ ? ????????JSONObject?object?=?new?JSONObject(); ????????object.put("telephone",?telephone); ? ????????//首先獲取token ????????tokenString?=?getToken(); ????????String?response?=?doPost("http://localhost/searchUrl",?object); ????????//如果返回的結(jié)果是list形式的,需要使用JSONObject.parseArray轉(zhuǎn)換 ????????//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是這些代碼的集合的大成者,編寫簡(jiǎn)單,目前可以采用的調(diào)用接口有:
delete() HTTP DELETE在特定操作的 URL 上對(duì)資源執(zhí)行
exchange() 在URL上執(zhí)行特定的HTTP方法,返回包含對(duì)象的ResponseEntity,這個(gè)對(duì)象是從請(qǐng)求體中映射到的
execute() 在上執(zhí)行特定的HTTP方法,返回一個(gè)從響應(yīng)體映射到的對(duì)象
get) 發(fā)送一個(gè)HTTP GET請(qǐng)求返回的ResponseEntity包含了響應(yīng)體,映射成的對(duì)象
getForObject() 發(fā)送HTTP GET請(qǐng)求,返回的請(qǐng)求體將映射為一個(gè)對(duì)象
postForEntity() POST 數(shù)據(jù)到一個(gè)URL,返回包含一個(gè)對(duì)象的ResponseEntity,這個(gè)對(duì)象是從響應(yīng)體中映射的
postForObject() POST 數(shù)據(jù)到一個(gè) URL,返回根據(jù)響應(yīng)體形成的對(duì)象
headForHeaders() 發(fā)送HTTP HEAD請(qǐng)求,返回包含特定資源URL的HTTP頭
optionsForAllow() 發(fā)送HTTP OPTIONS請(qǐng)求,返回對(duì)特定URL的Allow頭信息
postForLocation() POST 數(shù)據(jù)到一個(gè) URL,返回新創(chuàng)建資源的 URL
put() PUT 資源到特定的 URL
首先導(dǎo)入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 ????????
?
?
在啟動(dòng)類同包下創(chuàng)建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方式請(qǐng)求第三方http接口?getForEntity ?????*?@param?url ?????*?@return ?????*/ ????public?User?doGetWith1(String?url){ ????????ResponseEntity?responseEntity?=?restTemplate.getForEntity(url,?User.class); ????????User?user?=?responseEntity.getBody(); ????????return?user; ????} ? ????/** ?????*?以get方式請(qǐng)求第三方http接口?getForObject ?????*?返回值返回的是響應(yīng)體,省去了我們?cè)偃etBody() ?????*?@param?url ?????*?@return ?????*/ ????public?User?doGetWith2(String?url){ ????????User?user??=?restTemplate.getForObject(url,?User.class); ????????return?user; ????} ? ????/** ?????*?以post方式請(qǐng)求第三方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方式請(qǐng)求第三方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參數(shù) ????????HttpHeaders?headers?=?new?HttpHeaders(); ????????String?token?=?"asdfaf2322"; ????????headers.add("authorization",?token); ????????headers.setContentType(MediaType.APPLICATION_JSON); ? ????????//放入body中的json參數(shù) ????????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
現(xiàn)在也是蠻流行的,基于手機(jī)端很火的,這里分享一下OkHttpClient客戶端,業(yè)務(wù)代碼get、post請(qǐng)求直接調(diào)用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.?")); ? ????/** ?????*?單例模式(雙重檢查模式)?獲取類實(shí)例 ?????* ?????*?@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狀態(tài)碼為"?+?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狀態(tài)碼為"?+?response.code()); ????????????} ????????????return?result; ????????}?catch?(Exception?e)?{ ????????????log.error("remote?interface?url:{}?have?a?ecxeption?{}",?url,?e); ????????????throw?new?RuntimeException("三方接口返回異常"); ????????} ????} ? }
?
?
編輯:黃飛
評(píng)論
查看更多