标签:
package com.paic.nets.common.esg;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.paic.pafa.app.lwc.core.util.CollectionUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang.StringUtils;
import org.directwebremoting.util.Logger;
import java.util.HashMap;
import java.util.Map;
/**
* ESG调用公共类
*/
public class ESGAccesser {
private static final Logger LOGGER = Logger.getLogger(ESGAccesser.class);
private static final String HTTP_POST = "POST";
private static final Map<String, String> TOKEN_CACHE = new HashMap<String, String>();
public static final String ERROR_TOKEN = "13002";
public static final String INVALID_TOKEN = "13012";
//ESG平台的
public static final String RET_STATUS = "ret";
//ESG平台返回标识成功的代码
public static final String STATUS_SUCCESS = "0";
private String getTokenUrl;
private String accessUrl;
private String vUserId;
private String vUserPassword;
/**
* 调用外网工具类
*
* @param esgUrlCode esg平台注册的接口CODE
* @param paramsMap 传入参数
* @param httpMethod 请求的类型
* @return 返回JSON结果
* @throws Exception
*/
public String inAccessOut(String esgUrlCode, Map paramsMap, String httpMethod) throws Exception {
if (StringUtils.isBlank(esgUrlCode) || StringUtils.isBlank(httpMethod)) {
return "";
}
String resultString = invoke(esgUrlCode, paramsMap, httpMethod);
JSONObject jsonObject = JSON.parseObject(resultString);
String retStatus = jsonObject.getString(RET_STATUS);
//13002:非法的access_token 13012:已失效的Invalid access_token
if (ERROR_TOKEN.equals(retStatus) || INVALID_TOKEN.equals(retStatus)) {
getAccessToken();
resultString = invoke(esgUrlCode, paramsMap, httpMethod);
jsonObject = JSON.parseObject(resultString);
retStatus = jsonObject.getString(RET_STATUS);
}
if (!STATUS_SUCCESS.equals(retStatus)) {
return "";
}
return jsonObject.getString("data");
}
/**
* 获得认签token(有效时长1小时)
*/
private void getAccessToken() {
StringBuffer url = new StringBuffer();
url.append(getTokenUrl).append("?client_id=" + vUserId).append("&grant_type=out_agent")
.append("&client_secret=").append(vUserPassword);
LOGGER.info("开始获取token:url:[[" + url);
String tokenResult = doGet(url.toString(), null);
LOGGER.info("结束获取token:tokenResult:[[" + tokenResult);
JSONObject jsonObject = JSON.parseObject(tokenResult);
String retStatus = jsonObject.getString(RET_STATUS);
if (!STATUS_SUCCESS.equals(retStatus)) {
return;
}
TOKEN_CACHE.put("token", jsonObject.getJSONObject("data").getString("access_token"));
}
/**
* 执行http请求
* @param esgUrlCode esg平台接口编码
* @param paramsMap 参数
* @param httpMethod 调用方式 post get
* @return
*/
private String invoke(String esgUrlCode, Map paramsMap, String httpMethod) {
LOGGER.info("开始调用:esgUrlCode:[[" + esgUrlCode + "]],paramsMap:[[" +
JSON.toJSONString(paramsMap) + "]],httpMethod:[[" + httpMethod);
StringBuffer url = new StringBuffer();
url.append(accessUrl).append(esgUrlCode).append("?esg_outer_access_token=").append(TOKEN_CACHE.get("token"))
.append("&esg_outer_request_id=").append(System.currentTimeMillis());
String resultString;
if (HTTP_POST.equalsIgnoreCase(httpMethod)) {
resultString = doPost(url.toString(), paramsMap);
} else {
resultString = doGet(url.toString(), paramsMap);
}
LOGGER.info("结果调用:resultString:[[" + resultString);
return resultString;
}
/**
* 执行一个HTTP GET请求,返回请求响应的HTML
*
* @param url 请求的URL地址
* @param params 请求的查询参数,可以为null
* @return 返回请求响应的HTML
*/
private String doGet(String url, Map<String, String> params) {
String queryString = getUrlFromParaMap(params);
GetMethod method = new GetMethod(url);
String response = "";
try {
if (StringUtils.isNotBlank(queryString)) {
method.setQueryString(URIUtil.encodeQuery(queryString));
}
method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
method.addRequestHeader("Accept", "application/json;charset=utf-8");
HttpClient client = new HttpClient();
client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
response = method.getResponseBodyAsString();
}
} catch (URIException e) {
LOGGER.error("执行HTTP Get请求时,编码查询字符串[[" + queryString + "]]发生异常!", e);
} catch (Exception e) {
LOGGER.error("执行HTTP Get请求[[" + url + "]]时,发生异常!", e);
} finally {
method.releaseConnection();
}
return response;
}
/**
* get请求解析map参数
* @param params
* @return
*/
private String getUrlFromParaMap(Map<String, String> params) {
if (CollectionUtils.isEmpty(params)) {
return "";
}
StringBuffer queryString = new StringBuffer();
queryString.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
queryString.append("&").append(entry.getKey()).append("=").append(entry.getValue());
}
return queryString.toString();
}
/**
* 执行一个HTTP POST请求,返回请求响应的HTML
*
* @param url 请求的URL地址
* @param params 请求的查询参数,可以为null
* @return 返回请求响应的HTML
*/
private String doPost(String url, Map<String, String> params) {
NameValuePair[] valuePairs = getPostPair(params);
PostMethod method = new PostMethod(url);
if (valuePairs != null) {
method.setRequestBody(valuePairs);
}
method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");//关键代码
method.addRequestHeader("Accept", "application/json;charset=utf-8");//关键代码
String response = "";
try {
HttpClient client = new HttpClient();
client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
response = method.getResponseBodyAsString();
}
} catch (Exception e) {
LOGGER.error("执行HTTP Post请求[[" + url + "]]时,发生异常!", e);
} finally {
method.releaseConnection();
}
return response;
}
/**
* post请求解析map参数
* @param params
* @return
*/
private NameValuePair[] getPostPair(Map<String, String> params) {
if (CollectionUtils.isEmpty(params)) {
return new NameValuePair[0];
}
NameValuePair[] pairs = new NameValuePair[params.size()];
NameValuePair tempPair;
int size = 0;
for (Map.Entry<String, String> entry : params.entrySet()) {
tempPair = new NameValuePair(entry.getKey(), entry.getValue());
pairs[size] = tempPair;
size++;
}
return pairs;
}
public String getGetTokenUrl() {
return getTokenUrl;
}
public void setGetTokenUrl(String getTokenUrl) {
this.getTokenUrl = getTokenUrl;
}
public String getAccessUrl() {
return accessUrl;
}
public void setAccessUrl(String accessUrl) {
this.accessUrl = accessUrl;
}
public String getvUserId() {
return vUserId;
}
public void setvUserId(String vUserId) {
this.vUserId = vUserId;
}
public String getvUserPassword() {
return vUserPassword;
}
public void setvUserPassword(String vUserPassword) {
this.vUserPassword = vUserPassword;
}
}
标签:
原文地址:http://www.cnblogs.com/hailei/p/4863454.html