import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.security.GeneralSecurityException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.List;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocket;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.lang3.StringUtils;import org.apache.commons.lang3.math.NumberUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.SSLContextBuilder;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.conn.ssl.X509HostnameVerifier;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;/** * 服务器端请求服务类 * * @author Administrator * @date 2018年1月15日 * @version 1.0 */@SuppressWarnings("deprecation")public abstract class RequestService { /** jackJson 转化工具 **/ private static final ObjectMapper mapper = new ObjectMapper(); /** 连接池配置 **/ private static PoolingHttpClientConnectionManager connMgr; /** requestConfig **/ private static RequestConfig requestConfig; /** 日志 **/ private static Logger logger = LoggerFactory.getLogger(RequestService.class); /** 服务器地址 **/ private static final String HOST_PATH = H5FileUtils.getValueFromProperties("remote.server.host"); /** 连接超时 **/ private static final int CONNECTION_TIMEOUT = NumberUtils.toInt(H5FileUtils.getValueFromProperties("remote.conntection.timeout")) * 1000; static { // 设置连接池 connMgr = new PoolingHttpClientConnectionManager(); // 设置连接池大小 connMgr.setMaxTotal(100); connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal()); RequestConfig.Builder configBuilder = RequestConfig.custom(); // 设置连接超时 configBuilder.setConnectTimeout(CONNECTION_TIMEOUT); // 设置读取超时 configBuilder.setSocketTimeout(CONNECTION_TIMEOUT); // 设置从连接池获取连接实例的超时 configBuilder.setConnectionRequestTimeout(CONNECTION_TIMEOUT); // 在提交请求之前 测试连接是否可用 configBuilder.setStaleConnectionCheckEnabled(true); requestConfig = configBuilder.build(); } /** * GET方式请求远端服务器数据 * @param url * @return * @throws IOException * @throws ClientProtocolException */ @SuppressWarnings("rawtypes") protected ResponseVO getRemoteReqData(String url){ logger.debug(">>>getRemoteReqData(String url)"); logger.debug("url:" + url); return this.getRemoteReqData(url, null); } /**默认采用不解码形式 * GET方式请求远端服务器数据 * @param url * @return * @throws IOException * @throws ClientProtocolException */ @SuppressWarnings("rawtypes") protected ResponseVO getRemoteReqData(String url, String specifyUrl) { logger.debug(">>>getRemoteReqData(String url, String specifyUrl)"); logger.debug("url:" + url); logger.debug("specifyUrl:" + specifyUrl); return this.getRemoteReqData(url, specifyUrl, CommonConstants.DECODE_N); } /** * GET方式请求远端服务器数据 * @param url * @return ResponseVO * @throws IOException * @throws ClientProtocolException */ @SuppressWarnings("rawtypes") protected ResponseVO getRemoteReqData(String url, String specifyUrl, String isDecode) { logger.debug(">>>getRemoteReqData(String url, String specifyUrl, String isDecode)"); logger.debug("url:" + url); logger.debug("specifyUrl:" + specifyUrl); logger.debug("isDecode:" + isDecode); // 开启服务 CloseableHttpClient client = getHttpClients(specifyUrl); // 主库判断 if(StringUtils.isNotEmpty(specifyUrl)){ url = specifyUrl + url; }else{ url = getHostUrl() + url; } logger.debug("-> getUrl:" + url); HttpGet get = new HttpGet(url); ResponseVO respVO = null; try { HttpResponse response=client.execute(get); if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ HttpEntity entity=response.getEntity(); String returnValue = EntityUtils.toString(entity,CommonConstants.CHARSET_DEFAULT); // 解码判断 if(StringUtils.equals(isDecode, CommonConstants.DECODE_Y)){ returnValue = URLDecoder.decode(returnValue, CommonConstants.CHARSET_DEFAULT); } logger.debug("->getRequest:returnValue from remoteUrl: " + returnValue); respVO = mapper.readValue(returnValue, ResponseVO.class); }else if(HttpStatus.SC_NO_CONTENT==response.getStatusLine().getStatusCode()){ respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接未能接通!"); }else if(HttpStatus.SC_NOT_FOUND==response.getStatusLine().getStatusCode()){ respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接地址未找到!"); }else if(HttpStatus.SC_BAD_REQUEST ==response.getStatusLine().getStatusCode()) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程接口需求数据与本地数据不匹配!"); } } catch (ClientProtocolException e) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接出现错误!"); e.printStackTrace(); } catch (IOException e) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程端口出现错误!"); e.printStackTrace(); } logger.debug("<<>>getRemoteReqStream(String url)"); logger.debug("url:" + url); return getRemoteReqStream(url, null); } /** * GET方式请求远端服务器流, * 因返回InputStream输入流,因此一定要try catch,关闭 * @param url * @return InputStream * @throws IOException * @throws ClientProtocolException */ protected InputStream getRemoteReqStream(String url, String specifyUrl) throws ClientProtocolException, IOException{ logger.debug(">>>getRemoteReqStream(String url, String specifyUrl)"); logger.debug("url:" + url); logger.debug("specifyUrl:" + specifyUrl); // 主库判断 if(StringUtils.isNotEmpty(specifyUrl)){ url = specifyUrl + url; }else{ url = getHostUrl() + url; } logger.debug("-> getStreamUrl:" + url); // 开启服务 CloseableHttpClient client = getHttpClients(specifyUrl); HttpGet get=new HttpGet(url); InputStream is = null; HttpResponse response=client.execute(get); if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ HttpEntity entity=response.getEntity(); is = entity.getContent(); } logger.debug("<< >>postRemoteReqData(String url, HttpEntity entity)"); logger.debug("url:" + url); logger.debug("entity:{}", entity); return postRemoteReqData(url, entity, null); } /** * 默认此方法不采用解码形式 * POST方式请求远端服务器数据 * @param url * @return ResponseVO */ @SuppressWarnings("rawtypes") protected ResponseVO postRemoteReqData(String url, HttpEntity entity, String specifyUrl){ logger.debug(">>>postRemoteReqData(String url, HttpEntity entity)"); logger.debug("url:" + url); logger.debug("entity:{}", entity); logger.debug("specifyUrl:" + specifyUrl); return postRemoteReqData(url, entity, specifyUrl, CommonConstants.DECODE_N); } /** * post请求 * @param rEMOTE_URL_GESTURE_SAVE * @param createParams * @param specifyUrl(指定url) * @return ResponseVO */ @SuppressWarnings({ "rawtypes"}) public ResponseVO postRemoteReqData(String url, HttpEntity entity, String specifyUrl, String isDecode) { logger.debug(">>>postRemoteReqData(String url, HttpEntity entity, String specifyUrl, String isDecode)"); logger.debug("url:" + url); logger.debug("entity:{}", entity); logger.debug("specifyUrl:" + specifyUrl); logger.debug("isDecode:" + isDecode); // 主库判断 if(StringUtils.isNotEmpty(specifyUrl)){ url = specifyUrl + url; } else{ url = getHostUrl() + url; } logger.debug("-> postUrl:" + url); // 开启服务 CloseableHttpClient client = getHttpClients(specifyUrl); //POST的URL HttpPost httpPost = new HttpPost(url); // 返回值 ResponseVO respVO = null; //添加参数 httpPost.setEntity(entity); HttpResponse response; try { response = client.execute(httpPost); if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ String returnValue = EntityUtils.toString(response.getEntity(),CommonConstants.CHARSET_DEFAULT); // 解码判断 if(StringUtils.equals(isDecode, CommonConstants.DECODE_Y)){ returnValue = URLDecoder.decode(returnValue, CommonConstants.CHARSET_DEFAULT); } logger.debug("->getRequest:returnValue from remoteUrl: " + returnValue); respVO = mapper.readValue(returnValue, ResponseVO.class); }else if(HttpStatus.SC_NO_CONTENT==response.getStatusLine().getStatusCode()){ respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接未能接通!"); }else if(HttpStatus.SC_NOT_FOUND==response.getStatusLine().getStatusCode()){ respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接地址未找到!"); }else if(HttpStatus.SC_BAD_REQUEST ==response.getStatusLine().getStatusCode()) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程接口需求数据与本地数据不匹配!"); } } catch (ClientProtocolException e) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程连接出现错误!"); e.printStackTrace(); } catch (IOException e) { respVO = new ResponseVO(); respVO.setResponseCode("-1"); respVO.setResponseMessage("远程端口出现错误!"); e.printStackTrace(); } logger.debug("respVO:{}", respVO); logger.debug("<< >>createParams(String[] names, String[] values)"); logger.debug("names:{}", names.toString()); logger.debug("values:{}", values.toString()); List paramsList = new ArrayList (); HttpEntity entity = null; for(int i = 0; i < names.length; i++){ paramsList.add(new BasicNameValuePair(names[i], values[i])); } try{ entity = new UrlEncodedFormEntity(paramsList, CommonConstants.CHARSET_DEFAULT); }catch(UnsupportedEncodingException e){ logger.debug("->UnsupportedEncodingException:", e); } logger.debug("paramsList:{}", paramsList); logger.debug("<< >> createJsonParams(Object jsonObject)"); logger.debug("jsonObject:{}", jsonObject); StringEntity entity = null; try{ entity = new StringEntity(H5Utils.mapper.writeValueAsString(jsonObject), CommonConstants.CHARSET_DEFAULT); entity.setContentEncoding(CommonConstants.CHARSET_DEFAULT); entity.setContentType("application/json"); } catch (JsonProcessingException e) { logger.debug("->JsonProcessingException:", e); } logger.debug("entity:{}", entity); logger.debug("<< >>getHostUrl()"); String url = HOST_PATH; logger.debug("url:" + url); logger.debug("<< >>getHttpClients(String specifyUrl)"); logger.debug("specifyUrl:" + specifyUrl); // https问题 CloseableHttpClient httpClient = null; if(StringUtils.isNotEmpty(specifyUrl) && specifyUrl.indexOf("https:") > 0){ httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); }else{ httpClient = HttpClients.custom().setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); logger.debug("provIp: " + specifyUrl); } logger.debug("<< convertListToObject(List originalList,Class class1) { logger.debug(">>>convertListToObject(List originalList,Class class1)"); logger.debug("originalList:{}", originalList); logger.debug("class1:{}", class1); List
简单的remote Request:
HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(url); // 请求超时 client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000); post.addHeader("Content-type","application/x-www-form-urlencoded;charset=utf-8"); post.setEntity(entity); try { client.execute(post); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }