更新時間:2020-05-15 15:52:46 來源:動力節點 瀏覽2169次
“你調用別人的接口”:
這里提供的方法是POST和GET的方法.
使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。
1. 創建HttpClient對象。
2. 創建請求方法的實例,并指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
3. 如果需要發送請求參數,我使用的是List<NameValuePair>,采用鍵值對的形式
4. 釋放連接。無論執行方法是否成功,都必須釋放連接
來個代碼進行討論把,我會在代碼里面進行詳細的講解,這里主要是post和get的方法.
1.先來一個常量類:
/*************************************************接口部分**************************************************/???
????/**
?????*?請求正常
?????*/
????public?static?final?int?SUCCESS?=?200;
????
????/**
?????*?請求參數有誤
?????*/
????public?static?final?int?PARAMETER_EXCEPTION?=?400;
????
????/**
?????*?認證失敗
?????*/
????public?static?final?int?AUTHENTICATION_FAILED?=?401;
????
????/**
?????*?請求地址錯誤或不存在
?????*/
????public?static?final?int?ADDRESS_EXCEPTION?=?404;
????
????/**
?????*?請求地址錯誤或不存在
?????*/
????public?static?final?int?SERVER_EXCEPTION?=?500;
????
????/**
?????*?接口狀態碼判斷
?????*/
????public?static?String?putThrowException(int?statusCode)?{
????????String?e?=?"";
????????if(PARAMETER_EXCEPTION?==?statusCode)?{
????????????e?=?"請求參數有誤";
????????}else?if(AUTHENTICATION_FAILED?==?statusCode)?{
????????????e?=?"認證失敗";
????????}else?if(ADDRESS_EXCEPTION?==?statusCode)?{
????????????e?=?"請求地址錯誤或不存在";
????????}else?if(SERVER_EXCEPTION?==?statusCode)?{
????????????e?=?"服務器狀態異常";
????????}
????????return?e;
????}????/**
?????*?Token元素
?????*/
????public?static?final?String?USERNAME?=?"tianxun";
????public?static?final?String?PASSWORD?=?"123456";
????public?static?final?String?token?=?"dGlhbnh1biUzQTEyMzQ1Ng==";
2.接口類:
package?cn.tisson.bycs.utils;
import?java.io.IOException;
import?java.io.UnsupportedEncodingException;
import?java.net.URLEncoder;
import?java.net.UnknownHostException;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
import?javax.net.ssl.SSLException;
import?org.apache.commons.httpclient.HttpException;
import?org.apache.http.Consts;
import?org.apache.http.HttpEntity;
import?org.apache.http.HttpEntityEnclosingRequest;
import?org.apache.http.HttpRequest;
import?org.apache.http.NameValuePair;
import?org.apache.http.NoHttpResponseException;
import?org.apache.http.client.HttpRequestRetryHandler;
import?org.apache.http.client.config.RequestConfig;
import?org.apache.http.client.entity.UrlEncodedFormEntity;
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.client.protocol.HttpClientContext;
import?org.apache.http.client.utils.URIUtils;
import?org.apache.http.client.utils.URLEncodedUtils;
import?org.apache.http.conn.ConnectTimeoutException;
import?org.apache.http.impl.client.CloseableHttpClient;
import?org.apache.http.impl.client.HttpClients;
import?org.apache.http.message.BasicNameValuePair;
import?org.apache.http.protocol.HttpContext;
import?org.apache.http.util.EntityUtils;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?org.apache.commons.codec.binary.Base64;
import?cn.tisson.bycs.cst.Constants;
/**
?*?????接口常用工具類
?*?@author?zahngrh
?*
?*/
public?class?serviceUtils?{
????
????private?static?final?Logger?logger?=?LoggerFactory.getLogger(serviceUtils.class);
????
????/**
?????*?Base64加密Token
?????*?@return
?????*?@throws?UnsupportedEncodingException
?????*/
????public?static?String?getBase64()?throws?UnsupportedEncodingException?{
????????String?str?=?Constants.USERNAME+":"+Constants.PASSWORD;
????????final?byte[]?textByte?=?str.getBytes("UTF-8");
????????String?result=?Base64.encodeBase64String(textByte);
????????return?result;
????}
????public?static?void?main(String[]?args)?throws?UnsupportedEncodingException?{
????????System.out.println(getBase64());
????}
????
????/**
?????*?設置超時重試
?????*/
????public?static?HttpRequestRetryHandler?myRetryHandler?=?new?HttpRequestRetryHandler()?{
????????@Override
????????public?boolean?retryRequest(IOException?exception,int?executionCount,HttpContext?context)?{
????????????System.out.println("............................第"+executionCount+"次重試");
????????if?(executionCount?>=?3)?{
????????????return?false;
????????}else?if(exception?instanceof?UnknownHostException?||?exception?instanceof?ConnectTimeoutException
????????????????||?!(exception?instanceof?SSLException)?||?exception?instanceof?NoHttpResponseException)?{
????????????return?true;
????????}
????????????HttpClientContext?clientContext?=?HttpClientContext.adapt(context);
????????????HttpRequest?request?=?clientContext.getRequest();
????????????boolean?idempotent?=?!(request?instanceof?HttpEntityEnclosingRequest);
????????????if?(idempotent)?{
????????????//如果請求被認為是等冪,則重試
????????????????return?true;
????????????}
????????????return?false;
????????}
????};
????
????/**
?????*?接口請求工具類
?????*/
????public?static?Map<String,String>?requestResult(Map<String,String>?map,String?putType,String?url)?throws?HttpException,?IOException?{????????????
????????CloseableHttpResponse?response?=?null;????????
????????int?statusCode?=?0;?//?狀態碼??????
????????String?content?="";?//?返回結果????????
????????Map<String,String>?resultMap?=?new?HashMap();????????
????????//?創建httpclient對象
????????CloseableHttpClient?httpClient?=?HttpClients.createDefault();????????
????????//?設置參數
????????List<NameValuePair>?nameValuePairs?=?new?ArrayList<NameValuePair>();????????
????????for(String?key:map.keySet())?{
????????????nameValuePairs.add(new?BasicNameValuePair(key,map.get(key).toString()));
????????}????????
????????String?str?=?EntityUtils.toString(new?UrlEncodedFormEntity(nameValuePairs,Consts.UTF_8));????????
????????//?設置超時時間
????????RequestConfig?requestConfig?=?RequestConfig.custom()
????????????????.setSocketTimeout(5000)
????????????????.setConnectTimeout(5000)
????????????????.setConnectionRequestTimeout(5000)
????????????????.build();
????????????????
????????if(putType?!=?null?&&?"post".equals(putType)){????????????
????????????//?請求URL地址
????????????HttpPost?httpPost?=?new?HttpPost(url);????????????
????????????httpPost.setEntity(new?UrlEncodedFormEntity(nameValuePairs,Consts.UTF_8));????????????
????????????//?設置Token
????????????httpPost.setHeader("token",Constants.token);???????????
????????????httpPost.setConfig(requestConfig);???????????
????????????httpClient?=?HttpClients.custom().setRetryHandler(serviceUtils.myRetryHandler).build();????????????
????????????try?{
????????????????response?=?httpClient.execute(httpPost);????????????????
????????????????//?接收狀態碼
????????????????statusCode?=?response.getStatusLine().getStatusCode();????????????????
????????????}?catch?(Exception?e)?{
????????????????e.printStackTrace();
????????????}????????????
????????}else?if(putType?!=?null?&&?"get".equals(putType))?{????????????
????????????//?請求URL地址
????????????HttpGet?httpGet?=?new?HttpGet(url+"?"+str);
????????????//?設置Token
????????????httpGet.setHeader("token",Constants.token);
????????????httpGet.setConfig(requestConfig);
????????????httpClient?=?HttpClients.custom().setRetryHandler(serviceUtils.myRetryHandler).build();
????????????try?{
????????????????response?=?httpClient.execute(httpGet);
????????????????//?接收狀態碼
????????????????statusCode?=?response.getStatusLine().getStatusCode();
????????????}?catch?(Exception?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????????
????????//?判斷狀態碼
????????if?(Constants.SUCCESS?==?statusCode)?{
????????????HttpEntity?entity?=?response.getEntity();
????????????content?=?EntityUtils.toString(entity,?"utf-8");
????????????logger.info(content);
????????}?else?{
????????????//logger.error("狀態碼:"+Constants.putThrowException(statusCode));
????????}?
????????resultMap.put("statusCode",?String.valueOf(statusCode));
????????resultMap.put("result",?content);
????????try?{
????????????//?釋放client
????????????httpClient.close();
????????}?catch?(IOException?e)?{
????????????logger.error("http接口調用異常:url?is::"?+?url,?e);
????????}???????????
????????return?resultMap;
????}??
}
對于接口類的調用:
/**
*根據業務使用接口,對返回值進行自我的調整
**/
public?static?void?main(String[]?args)?throws?HttpException,?IOException?{
????????Map<String,String>?paraMap?=?new?HashMap();
????????paraMap.put("type",?"1");
????????System.out.println(serviceUtils.requestResult(paraMap,?"post",?"https://api.apiopen.top/musicRankingsDetails"));
????}
以上就是動力節點java培訓機構的小編針對“技術知識分享,Java接口調用的處理”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習