文档章节

HttpClient 和 HttpUrlConnection 简单封装

l
 lykin1972
发布于 2016/04/14 17:08
字数 1657
阅读 175
收藏 3
点赞 1
评论 0

  有时候在每一处调用外部代码写一次httpclient的调用或者httpurlconnection代码很冗余

  为了方便调用且对各种异常情况归类统计


  自己目前在用的HttpUtil的代码,对于HttpClient和HttpUrlConnection的代码,包含失败率的统计,满足常规需求

  如果不需要统计的,可以删除相关代码


  HttpUtil代码

package com.shield.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.NoHttpResponseException;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
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.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
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.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aliyun.oss.common.utils.IOUtils;
import com.shield.exception.CallInterfaceException;
import com.shield.model.Count;
/***
 * 所有调用http的服务都必须使用该类   该类实现调用http服务并且统计的功能
 * 统计的描述   统计字段   caller  总次数   成功次数   超时次数
 * 
 * @author slin
 * 2015年10月7日
 */
public class HttpUtil {
private final static Logger LOG = LoggerFactory.getLogger(HttpUtil.class);  
public final static int DEFAULT_READ_TIMEOUT = 5000 ;
public final static int DEFAULT_CONNECT_TIMEOUT = 2000 ;
public final static PoolingHttpClientConnectionManager HTTP_CLIENT_CONNECTION_MANAGER;
public static CloseableHttpClient httpClient;
static{
HTTP_CLIENT_CONNECTION_MANAGER = new PoolingHttpClientConnectionManager();
HTTP_CLIENT_CONNECTION_MANAGER.setMaxTotal(30);
HTTP_CLIENT_CONNECTION_MANAGER.setDefaultMaxPerRoute(HTTP_CLIENT_CONNECTION_MANAGER.getMaxTotal());
RequestConfig requestConfig = RequestConfig.custom()
            .setSocketTimeout(DEFAULT_READ_TIMEOUT+DEFAULT_CONNECT_TIMEOUT)
            .setConnectTimeout(DEFAULT_CONNECT_TIMEOUT)
            .build();
//请求重试处理
        HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
            public boolean retryRequest(IOException exception,int executionCount, HttpContext context) {
                if (executionCount >= 5) {// 如果已经重试了5次,就放弃                    
                    return false;
                }
                if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试                    
                    return true;
                }
                if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常                    
                    return false;
                }                
                if (exception instanceof InterruptedIOException) {// 超时                    
                    return false;
                }
                if (exception instanceof UnknownHostException) {// 目标服务器不可达                    
                    return false;
                }
                if (exception instanceof ConnectTimeoutException) {// 连接被拒绝                    
                    return false;
                }
                if (exception instanceof SSLException) {// ssl握手异常                    
                    return false;
                }
                 
                HttpClientContext clientContext = HttpClientContext.adapt(context);
                HttpRequest request = clientContext.getRequest();
                // 如果请求是幂等的,就再次尝试
                if (!(request instanceof HttpEntityEnclosingRequest)) {                    
                    return true;
                }
                return false;
            }
        };  
httpClient = HttpClients.custom().setConnectionManager(HTTP_CLIENT_CONNECTION_MANAGER).setRetryHandler(httpRequestRetryHandler).setDefaultRequestConfig(requestConfig).build();
}
public final static Map<String,Count> counter = new HashMap<String, Count>();
public static String get(String caller,String fullurl) throws CallInterfaceException{
byte [] response = getBytesHttpClientImpl(caller, fullurl,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT);
LOG.debug("GET caller ="+caller+",request :"+fullurl);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("GET caller ="+caller+",response :"+responseText);
return responseText;
}
@Deprecated
public static String getStringByHttpUrlConnectImpl(String caller,String fullurl) throws CallInterfaceException{
byte [] response = getBytesHttpUrlConnectionImpl(caller, fullurl,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT);
LOG.debug("GET caller ="+caller+",request :"+fullurl);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("GET caller ="+caller+",response :"+responseText);
return responseText;
}
public static String getStringByHttpClientImpl(String caller,String fullurl,int readTimeout,int connectTimeout,int tryAgainSize) throws CallInterfaceException{
byte [] response = getBytesHttpClientImpl(caller, fullurl,readTimeout,connectTimeout);
LOG.debug("GET caller ="+caller+",request :"+fullurl);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("GET caller ="+caller+",response :"+responseText);
return responseText;
}
public static String getStringByHttpClientImpl(String caller,String fullurl) throws CallInterfaceException{
byte [] response = getBytesHttpClientImpl(caller, fullurl,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT);
LOG.debug("GET caller ="+caller+",request :"+fullurl);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("GET caller ="+caller+",response :"+responseText);
return responseText;
}
public static String getStringByHttpUrlConnectImpl(String caller,String fullurl,int readTimeout,int connectTimeout,int tryAgainSize) throws CallInterfaceException{
byte [] response = getBytesHttpUrlConnectionImpl(caller, fullurl,readTimeout,connectTimeout);
LOG.debug("GET caller ="+caller+",request :"+fullurl);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("GET caller ="+caller+",response :"+responseText);
return responseText;
}
public static String postStringByHttpClientImpl(String caller,String url,String body,Header... headers) throws CallInterfaceException{
byte [] response = postBytesHttpClientImpl(caller, url,body,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT,headers);
LOG.debug("POST caller ="+caller+",request :"+url + "?"+body);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("POST caller ="+caller+",response :"+responseText);
return responseText;
}
@Deprecated
public static String postStringByHttpUrlConnectImpl(String caller,String url,String body,Header... headers) throws CallInterfaceException{
byte [] response = postBytesHttpUrlConnectionImpl(caller, url,body,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT,headers);
LOG.debug("POST caller ="+caller+",request :"+url+"?"+body);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("POST caller ="+caller+",response :"+responseText);
return responseText;
}
@Deprecated
public static String postStringByHttpUrlConnectImpl(String caller,String url,String body,int readTimeout,int connectTimeout, int trySize) throws CallInterfaceException{
byte [] response = postBytesHttpUrlConnectionImpl(caller, url,body,readTimeout,connectTimeout);
LOG.debug("POST caller ="+caller+",request :"+url+"?"+body);
String responseText = null ;
if(response != null && response.length > 0){
responseText = new String(response);
}
LOG.debug("POST caller ="+caller+",response :"+responseText);
return responseText;
}
@Deprecated
public static byte [] postBytesHttpUrlConnectionImpl(String caller,String url,String postData,int readTimeout,int connectTimeout, Header... headers) throws CallInterfaceException{
Count count = counter.get(caller);
if(count == null){
count = new Count();
counter.put(caller, count);
}
byte [] response = null ;
HttpURLConnection httpConn = null ;
  InputStream inputStream = null;   
try {
            URL tirc = new URL(url);
            httpConn = (HttpURLConnection) tirc.openConnection();
      httpConn.setDoOutput(true);// 使用 URL 连接进行输出   
      httpConn.setDoInput(true);// 使用 URL 连接进行输入   
      httpConn.setUseCaches(false);// 忽略缓存   
      httpConn.setRequestMethod("POST");// 设置URL请求方法   
      httpConn.setConnectTimeout(connectTimeout);
      httpConn.setReadTimeout(readTimeout);
      httpConn.setRequestProperty("Content-Length", "" + postData.length());
      httpConn.setRequestProperty("Content-Type", "application/json");   
      httpConn.setRequestProperty("Charset", "UTF-8");   
      
      OutputStreamWriter out = new OutputStreamWriter(httpConn.getOutputStream(), "UTF-8");
      out.write(postData);
            out.flush();
            out.close();
      int responseCode = httpConn.getResponseCode();   
      if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功   
      inputStream = httpConn.getInputStream();
      response = IOUtils.readStreamAsByteArray(inputStream);
      }
        }
catch (Exception e) {  
LOG.warn(e.getMessage() +",url="+url,e);
        count.timeout ++ ;
        throw new CallInterfaceException(e,url +"?"+ postData);
        }finally{  
            try {  
            if(inputStream!=null)
           inputStream.close();  
            if(httpConn!=null)
           httpConn = null ;
            } catch (IOException e) {  
                LOG.error(e.getMessage(),e);
            }  
        }  
count.success ++ ;
return response ;
}
public static byte [] getBytes(String caller,String fullurl) throws CallInterfaceException{
return getBytesHttpClientImpl(caller, fullurl,DEFAULT_READ_TIMEOUT,DEFAULT_CONNECT_TIMEOUT);
}
@Deprecated
public static byte [] getBytesHttpUrlConnectionImpl(String caller,String fullurl,int readTimeout,int connectTimeout) throws CallInterfaceException{
Count count = counter.get(caller);
if(count == null){
count = new Count();
counter.put(caller, count);
}
byte [] response = null ;
String url = null ;
HttpURLConnection httpConn = null ;
  InputStream inputStream = null;   
try {
        url = fullurl;
            URL tirc = new URL(url);
            httpConn = (HttpURLConnection) tirc.openConnection();
      httpConn.setDoOutput(false);// 使用 URL 连接进行输出   
      httpConn.setDoInput(true);// 使用 URL 连接进行输入   
      httpConn.setUseCaches(false);// 忽略缓存   
      httpConn.setRequestMethod("GET");// 设置URL请求方法   
      httpConn.setConnectTimeout(connectTimeout);
      httpConn.setReadTimeout(readTimeout);
      httpConn.setRequestProperty("Content-Type", "application/json");   
      httpConn.setRequestProperty("Charset", "UTF-8");   
      
      int responseCode = httpConn.getResponseCode();   
      if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功   
      inputStream = httpConn.getInputStream();
      response = IOUtils.readStreamAsByteArray(inputStream);
      }
        }
catch (Exception e) {  
            LOG.warn(e.getMessage() +",url="+url,e);
        count.timeout ++ ;
        throw new CallInterfaceException(e,fullurl);
        }finally{  
            try {  
            if(inputStream!=null)
           inputStream.close();  
            if(httpConn!=null)
           httpConn.disconnect();
           httpConn = null ;
            } catch (IOException e) {  
                LOG.error(e.getMessage(),e);
            }  
        }  
count.success ++ ;
return response ;
}
public static byte [] getBytesHttpClientImpl(String caller,String fullurl,int readTimeout,int connectTimeout) throws CallInterfaceException{
Count count = counter.get(caller);
if(count == null){
count = new Count();
counter.put(caller, count);
}
byte [] response = null ;
CloseableHttpResponse httpResponse = null ;
try{
HttpGet httpGet = new HttpGet(fullurl);
config(httpGet,readTimeout,connectTimeout);
httpResponse = httpClient.execute(httpGet);
if (HttpURLConnection.HTTP_OK == httpResponse.getStatusLine().getStatusCode()){
HttpEntity entity = httpResponse.getEntity();
response = EntityUtils.toByteArray(entity);
}
}catch(Exception e){
LOG.warn(e.getMessage() +",url="+fullurl,e);
        count.timeout ++ ;
        throw new CallInterfaceException(e,fullurl);
}finally{  
          try {  
           if(httpResponse!=null)
           httpResponse.close();
             } catch (IOException e) {  
               LOG.error(e.getMessage(),e);
             }  
         }  
count.success ++ ;
 return response ;
}
public static byte [] postBytesHttpClientImpl(String caller,String fullurl,String body,int readTimeout,int connectTimeout,Header ...headers) throws CallInterfaceException{
Count count = counter.get(caller);
if(count == null){
count = new Count();
counter.put(caller, count);
}
byte [] response = null ;
CloseableHttpResponse httpResponse = null ;
try{
HttpPost httpPost = new HttpPost(fullurl);
config(httpPost,readTimeout,connectTimeout);
httpPost.setEntity(new StringEntity(body, "utf-8"));
if(headers!=null&&headers.length>0){
httpPost.setHeaders(headers);
}
httpResponse = httpClient.execute(httpPost);
if (HttpURLConnection.HTTP_OK == httpResponse.getStatusLine().getStatusCode()){
HttpEntity entity = httpResponse.getEntity();
response = EntityUtils.toByteArray(entity);
}
}catch(Exception e){
LOG.warn(e.getMessage() +",url="+fullurl,e);
        count.timeout ++ ;
        throw new CallInterfaceException(e,fullurl);
}finally{  
          try {  
           if(httpResponse!=null)
           httpResponse.close();
             } catch (IOException e) {  
               LOG.error(e.getMessage(),e);
             }  
         }  
count.success ++ ;
 return response ;
} 
private static void config(HttpRequestBase httpRequestBase, int readTimeout, int connectTimeout) {
        httpRequestBase.setHeader("User-Agent", "Devond HttpUtil");
        httpRequestBase.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        httpRequestBase.setHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");//"en-US,en;q=0.5");
        httpRequestBase.setHeader("Accept-Charset", "ISO-8859-1,utf-8,gbk,gb2312;q=0.7,*;q=0.7");
         
        // 配置请求的超时设置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(readTimeout + connectTimeout)
                .setConnectTimeout(connectTimeout)
                .setSocketTimeout(readTimeout)
                .build();
        httpRequestBase.setConfig(requestConfig);        
    }
}


其他相关代码

package com.shield.exception;
import java.net.SocketTimeoutException;
public class CallInterfaceException extends Exception{
/**
 * 
 */
private static final long serialVersionUID = 4983997949599323781L;
public CallInterfaceException(Throwable throwable, String url) {
super(throwable);
this.url = url ;
this.message = throwable.getMessage() ;
if(throwable instanceof SocketTimeoutException){
if(throwable.getMessage().contains("connect")){
this.type = CONNECT_TIMEOUT ;
}else{
this.type = READ_TIMEOUT ;
}
}else{
this.type = EXCEPTION ;
}
}
public CallInterfaceException(Throwable throwable,String url,int type) {
super(throwable);
this.url = url ;
this.message = throwable.getMessage() ;
this.type = type ;
}
private int type ; //失败类型
private String url ;
private String message ;
public String getMessage() {
return "type="+type+",message="+message+",url="+url;
}
public int getType() {
return type;
}
public String getUrl() {
return url;
}
public final static int CONNECT_TIMEOUT = 0;
public final static int READ_TIMEOUT = 1 ;
public final static int NOT_ASSOCIATED = 2 ;
public final static int EXCEPTION = -1 ;
}

package com.shield.model;
import com.shield.util.DateUtil;
public class Count {
public int error ;
public int timeout ;
public int success ;
public int nodata ;
public int unknown ;
public long initTime = DateUtil.currentTimeSeconds();
public void clear(){
error = 0 ;
timeout = 0;
success = 0 ;
nodata = 0 ;
unknown = 0 ;
initTime = DateUtil.currentTimeSeconds();
}
}


© 著作权归作者所有

共有 人打赏支持
l
粉丝 0
博文 8
码字总数 3986
作品 0
岳阳
聊聊spring cloud gateway的NettyConfiguration

序 本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration spring cloud gateway使用的是reactor的httpclient,其通过nettyClientOptions这个bean来进行构造options,......

go4it ⋅ 06/03 ⋅ 0

聊聊spring cloud的PreserveHostHeaderGatewayFilter

序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/14 ⋅ 0

大家都用什么工具发起http请求的呢?

我以前喜欢用apache的 httpClient ,公司用jersey。听经理说jersey的性能好,是真的吗?我在网上并没有搜到相关的性能比较,java9也带了一个httpClient,不知性能对比起来又如何?...

暗中观察 ⋅ 04/22 ⋅ 0

关于HttpClient重试策略的研究

原文出处:kingszelda 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题:...

kingszelda ⋅ 04/25 ⋅ 0

使用httpClient 调起https url接口

遇到的问题* 1、ssl证书信任,解决方式信任所有证书 2、生成请求体调用httpPost.setEntity()时输出的参数格式有误,有多种Entity可以选择(常用 StringEntity、UrlEncodedFormEntity、FileE...

梦魂清风 ⋅ 05/10 ⋅ 0

Httpclient报Timeout waiting for connection from pool 异常

下面这段代码在定时一分钟的任务里面执行: public String remoteJsonUTF8(String url) { HttpGet get = null; CloseableHttpResponse response = null; String json = null; CloseableHttpCl......

小小的小小snake ⋅ 05/17 ⋅ 0

说说在 Android 中如何发送 HTTP 请求

客户端会向服务器发出一条 HTTP 请求,服务器收到请求后会返回一些数据给客户端,然后客户端再对这些数据进行解析与处理。 1 HttpURLConnection 可以使用 HttpURLConnection(官方推荐) 来发...

deniro ⋅ 06/09 ⋅ 0

聊聊spring cloud gateway的streaming-media-types属性

序 本文主要研究下spring cloud gateway的streaming-media-types属性 配置 配置说明 GatewayProperties spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/07 ⋅ 0

聊聊spring cloud gateway的RemoveHopByHopHeadersFilter

序 本文主要研究一下spring cloud gateway的RemoveHopByHopHeadersFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway......

go4it ⋅ 05/30 ⋅ 0

用httpclient监控网站系统运行

java httpclient做一个监控网站运行情况的程序,第一次接触,望大牛指导

消褪少年 ⋅ 05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部