一、概述
在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或者自己寫的接口是否有接口。短信、天氣等)。
Java項目中調(diào)用接口的方式有:
通過JDK網(wǎng)絡(luò)類Java.net.HttpURLConnection;
通過common封裝好HttpClient;
通過 Apache 封裝好CloseableHttpClient;
通過SpringBoot-RestTemplate;
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項目地址: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請求和post請求都可以找到一個方法里面。
實現(xiàn)過程:
得到:
創(chuàng)建遠程連接
設(shè)置連接方式(get、post、put。。。)
設(shè)置連接時間
設(shè)置響應(yīng)讀取時間
發(fā)起請求
獲取請求數(shù)據(jù)
關(guān)閉連接
郵政:
創(chuàng)建遠程連接
設(shè)置連接方式(get、post、put。。。)
設(shè)置連接時間
設(shè)置響應(yīng)讀取時間
當(dāng)向遠程服務(wù)器傳送數(shù)據(jù)/寫入數(shù)據(jù)時,需要設(shè)置為true(setDoOutput)
當(dāng)前向遠程服務(wù)讀取數(shù)據(jù)時,設(shè)置為true,該參數(shù)可有可無(setDoInput)
設(shè)置參數(shù)格式的屬性:(請求參數(shù))
設(shè)置鑒權(quán)信息:授權(quán):(setRequestProperty)
參數(shù)設(shè)置
發(fā)起請求
獲取請求數(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請求 ?????*?@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è)置請求方式 ????????????connection.setRequestMethod("GET"); ????????????//設(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)閉遠程連接 ????????????connection.disconnect(); ????????} ????????return?result.toString(); ????} ? ????/** ?????*?Http?post請求 ?????*?@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)建連接對象 ????????????URL?url?=?new?URL(httpUrl); ????????????//創(chuàng)建連接 ????????????connection?=?(HttpURLConnection)?url.openConnection(); ????????????//設(shè)置請求方法 ????????????connection.setRequestMethod("POST"); ????????????//設(shè)置連接超時時間 ????????????connection.setConnectTimeout(15000); ????????????//設(shè)置讀取超時時間 ????????????connection.setReadTimeout(15000); ????????????//DoOutput設(shè)置是否向httpUrlConnection輸出,DoInput設(shè)置是否從httpUrlConnection讀入,此外發(fā)送post請求必須設(shè)置這兩個 ????????????//設(shè)置是否可讀取 ????????????connection.setDoOutput(true); ????????????connection.setDoInput(true); ????????????//設(shè)置通用的請求屬性 ????????????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è)置請求頭等 ????????????//開啟連接 ????????????//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); ????} }
?
?
運行結(jié)果:

2.2 通過apache通用封裝好的HttpClient
httpClient的get或post請求方式步驟:
生成一個HttpClient對象并設(shè)置相應(yīng)的參數(shù);
生成一個GetMethod對象或PostMethod并設(shè)置響應(yīng)的參數(shù);
用HttpClient生成的對象來執(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請求方式
?????*?使用GetMethod來訪問一個URL對應(yīng)的網(wǎng)頁實現(xiàn)步驟:
?????*?1.生成一個HttpClient對象并設(shè)置相應(yīng)的參數(shù);
?????*?2.生成一個GetMethod對象并設(shè)置響應(yīng)的參數(shù);
?????*?3.用HttpClient生成的對象來執(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對象并設(shè)置參數(shù)
????????HttpClient?httpClient?=?new?HttpClient();
????????//設(shè)置Http連接超時為5秒
????????httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
????????//2.生成GetMethod對象并設(shè)置參數(shù)
????????GetMethod?getMethod?=?new?GetMethod(url);
????????//設(shè)置get請求超時為5秒
????????getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,?5000);
????????//設(shè)置請求重試處理,用的是默認(rèn)的重試處理:請求三次
????????getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,?new?DefaultHttpMethodRetryHandler());
????????String?response?=?"";
????????//3.執(zhí)行HTTP?GET?請求
????????try?{
????????????int?statusCode?=?httpClient.executeMethod(getMethod);
????????????//4.判斷訪問的狀態(tài)碼
????????????if?(statusCode?!=?HttpStatus.SC_OK)?{
????????????????System.err.println("請求出錯:"?+?getMethod.getStatusLine());
????????????}
????????????//5.處理HTTP響應(yīng)內(nèi)容
????????????//HTTP響應(yīng)頭部信息,這里簡單打印
????????????Header[]?headers?=?getMethod.getResponseHeaders();
????????????for(Header?h?:?headers)?{
????????????????System.out.println(h.getName()?+?"---------------"?+?h.getValue());
????????????}
????????????//讀取HTTP響應(yīng)內(nèi)容,這里簡單打印網(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ù)量大時候推薦使用
????????????//InputStream?response?=?getMethod.getResponseBodyAsStream();
????????}?catch?(HttpException?e)?{
????????????//發(fā)生致命的異常,可能是協(xié)議不對或者返回的內(nèi)容有問題
????????????System.out.println("請檢查輸入的URL!");
????????????e.printStackTrace();
????????}?catch?(IOException?e)?{
????????????//發(fā)生網(wǎng)絡(luò)異常
????????????System.out.println("發(fā)生網(wǎng)絡(luò)異常!");
????????}?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");
????????//設(shè)置json格式傳送
????????postMethod.addRequestHeader("Content-Type",?"application/json;charset=GBK");
????????//必須設(shè)置下面這個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");
????????//添加請求參數(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));
????}
}
?
?
運行結(jié)果:

post請求的jsonObject參數(shù)也成功寫入
2.3 通過Apache封裝好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基礎(chǔ)上修改可以更新而來的,這里還涉及到請求頭的設(shè)置(請求),利用fastjson轉(zhuǎn)換請求或返回請求結(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對象
????????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方式調(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驗證使用
????????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è)置請求參數(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è)置請求參數(shù)
????????????httpPost.setEntity(se);
????????????HttpResponse?response?=?httpClient.execute(httpPost);
????????????//這里可以把返回的結(jié)果按照自定義的返回數(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;
????}
?
????/**
?????*?測試
?????*/
????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是這些代碼的集合的大成者,編寫簡單,目前可以采用的調(diào)用接口有:
delete() HTTP DELETE在特定操作的 URL 上對資源執(zhí)行
exchange() 在URL上執(zhí)行特定的HTTP方法,返回包含對象的ResponseEntity,這個對象是從請求體中映射到的
execute() 在上執(zhí)行特定的HTTP方法,返回一個從響應(yīng)體映射到的對象
get) 發(fā)送一個HTTP GET請求返回的ResponseEntity包含了響應(yīng)體,映射成的對象
getForObject() 發(fā)送HTTP GET請求,返回的請求體將映射為一個對象
postForEntity() POST 數(shù)據(jù)到一個URL,返回包含一個對象的ResponseEntity,這個對象是從響應(yīng)體中映射的
postForObject() POST 數(shù)據(jù)到一個 URL,返回根據(jù)響應(yīng)體形成的對象
headForHeaders() 發(fā)送HTTP HEAD請求,返回包含特定資源URL的HTTP頭
optionsForAllow() 發(fā)送HTTP OPTIONS請求,返回對特定URL的Allow頭信息
postForLocation() POST 數(shù)據(jù)到一個 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 ????????
?
?
在啟動類同包下創(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方式請求第三方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
?????*?返回值返回的是響應(yīng)體,省去了我們再去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參數(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)在也是蠻流行的,基于手機端很火的,這里分享一下OkHttpClient客戶端,業(yè)務(wù)代碼get、post請求直接調(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.?")); ? ????/** ?????*?單例模式(雙重檢查模式)?獲取類實例 ?????* ?????*?@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("三方接口返回異常"); ????????} ????} ? }
?
?
編輯:黃飛
電子發(fā)燒友App
























評論