zoukankan      html  css  js  c++  java
  • 基于JAVA原生HTTP请求工具类 httphelper

    原文地址;http://lushuifa.iteye.com/blog/2313896

      1 import java.io.BufferedReader;
      2 import java.io.BufferedWriter;
      3 import java.io.InputStream;
      4 import java.io.InputStreamReader;
      5 import java.io.OutputStreamWriter;
      6 import java.net.HttpURLConnection;
      7 import java.net.URL;
      8 import java.util.Map;
      9 import java.util.Set;
     10 
     11 import org.apache.log4j.Logger;
     12 
     13 /**
     14  * 提供通过HTTP协议获取内容的方法 <br/>
     15  * 所有提供方法中的params参数在内部不会进行自动的url encode,如果提交参数需要进行url encode,请调用方自行处理
     16  * @Description: HTTP请求代理工具
     17  * @author lushuifa
     18  * @date 2016年11月18日 上午11:21:05
     19  */
     20 public class HttpUtil {
     21     /**
     22      * logger
     23      */
     24     private static Logger logger = Logger.getLogger(HttpUtil.class);
     25     
     26     /**
     27      * 支持的Http method
     28      *
     29      */
     30     private static enum HttpMethod {
     31         POST,DELETE,GET,PUT,HEAD;
     32     };
     33     
     34     @SuppressWarnings({ "unchecked", "rawtypes" })
     35     private static String invokeUrl(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String encoding, HttpMethod method){
     36         //构造请求参数字符串
     37         StringBuilder paramsStr = null;
     38         if(params != null){
     39             paramsStr = new StringBuilder();
     40             Set<Map.Entry> entries = params.entrySet();
     41             for(Map.Entry entry:entries){
     42                 String value = (entry.getValue()!=null)?(String.valueOf(entry.getValue())):"";
     43                 paramsStr.append(entry.getKey() + "=" + value + "&");
     44             }
     45             //只有POST方法才能通过OutputStream(即form的形式)提交参数
     46             if(method != HttpMethod.POST){
     47                 url += "?"+paramsStr.toString();
     48             }
     49         }
     50         
     51         URL uUrl = null;
     52         HttpURLConnection conn = null;
     53         BufferedWriter out = null;
     54         BufferedReader in = null;
     55         try {
     56             //创建和初始化连接
     57             uUrl = new URL(url);
     58             conn = (HttpURLConnection) uUrl.openConnection();
     59             conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
     60             conn.setRequestMethod(method.toString());
     61             conn.setDoOutput(true);
     62             conn.setDoInput(true);
     63             //设置连接超时时间
     64             conn.setConnectTimeout(connectTimeout);
     65             //设置读取超时时间
     66             conn.setReadTimeout(readTimeout);
     67             //指定请求header参数
     68             if(headers != null && headers.size() > 0){
     69                 Set<String> headerSet = headers.keySet();
     70                 for(String key:headerSet){
     71                     conn.setRequestProperty(key, headers.get(key));
     72                 }
     73             }
     74 
     75             if(paramsStr != null && method == HttpMethod.POST){
     76                 //发送请求参数
     77                 out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),encoding));
     78                 out.write(paramsStr.toString());
     79                 out.flush();
     80             }
     81             
     82             //接收返回结果
     83             StringBuilder result = new StringBuilder();
     84             in = new BufferedReader(new InputStreamReader(conn.getInputStream(),encoding));
     85             if(in != null){
     86                 String line = "";
     87                 while ((line = in.readLine()) != null) {
     88                     result.append(line);
     89                 }
     90             }
     91             return result.toString();
     92         } catch (Exception e) {
     93             logger.error("调用接口["+url+"]失败!请求URL:"+url+",参数:"+params,e);
     94             //处理错误流,提高http连接被重用的几率
     95             try {
     96                 byte[] buf = new byte[100];
     97                 InputStream es = conn.getErrorStream();
     98                 if(es != null){
     99                     while (es.read(buf) > 0) {;}
    100                     es.close();
    101                 }
    102             } catch (Exception e1) {
    103                 e1.printStackTrace();
    104             }
    105         } finally {
    106             try {
    107                 if (out!=null) {
    108                     out.close();
    109                 }
    110             }catch (Exception e) {
    111                 e.printStackTrace();
    112             }
    113             try {
    114                 if (in !=null) {
    115                     in.close();
    116                 }
    117             }catch (Exception e) {
    118                 e.printStackTrace();
    119             }
    120             //关闭连接
    121             if (conn != null){
    122                 conn.disconnect();
    123             }   
    124         }
    125         return null;
    126     }
    127     
    128     /**
    129      * POST方法提交Http请求,语义为“增加” <br/>
    130      * 注意:Http方法中只有POST方法才能使用body来提交内容
    131      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    132      * @param params 参数
    133      * @param connectTimeout 连接超时时间(单位为ms)
    134      * @param readTimeout 读取超时时间(单位为ms)
    135      * @param charset 字符集(一般该为“utf-8”)
    136      * @return
    137      */
    138     public static String post(String url, Map params, int connectTimeout, int readTimeout, String charset){
    139         return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.POST);
    140     }
    141     
    142     /**
    143      * POST方法提交Http请求,语义为“增加” <br/>
    144      * 注意:Http方法中只有POST方法才能使用body来提交内容
    145      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    146      * @param params 参数
    147      * @param headers 请求头参数
    148      * @param connectTimeout 连接超时时间(单位为ms)
    149      * @param readTimeout 读取超时时间(单位为ms)
    150      * @param charset 字符集(一般该为“utf-8”)
    151      * @return
    152      */
    153     public static String post(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
    154         return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.POST);
    155     }
    156     
    157     /**
    158      * GET方法提交Http请求,语义为“查询”
    159      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    160      * @param params 参数
    161      * @param connectTimeout 连接超时时间(单位为ms)
    162      * @param readTimeout 读取超时时间(单位为ms)
    163      * @param charset 字符集(一般该为“utf-8”)
    164      * @return
    165      */
    166     public static String get(String url, Map params, int connectTimeout, int readTimeout, String charset){
    167         return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.GET);
    168     }
    169     
    170     /**
    171      * GET方法提交Http请求,语义为“查询”
    172      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    173      * @param params 参数
    174      * @param headers 请求头参数
    175      * @param connectTimeout 连接超时时间(单位为ms)
    176      * @param readTimeout 读取超时时间(单位为ms)
    177      * @param charset 字符集(一般该为“utf-8”)
    178      * @return
    179      */
    180     public static String get(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){
    181         return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.GET);
    182     }
    183     
    184     /**
    185      * PUT方法提交Http请求,语义为“更改” <br/>
    186      * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
    187      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    188      * @param params 参数
    189      * @param connectTimeout 连接超时时间(单位为ms)
    190      * @param readTimeout 读取超时时间(单位为ms)
    191      * @param charset 字符集(一般该为“utf-8”)
    192      * @return
    193      */
    194     public static String put(String url, Map params, int connectTimeout, int readTimeout, String charset){
    195         return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.PUT);
    196     }
    197     
    198     /**
    199      * PUT方法提交Http请求,语义为“更改” <br/>
    200      * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
    201      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    202      * @param params 参数
    203      * @param headers 请求头参数
    204      * @param connectTimeout 连接超时时间(单位为ms)
    205      * @param readTimeout 读取超时时间(单位为ms)
    206      * @param charset 字符集(一般该为“utf-8”)
    207      * @return
    208      */
    209     public static String put(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){
    210         return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.PUT);
    211     }    
    212     
    213     /**
    214      * DELETE方法提交Http请求,语义为“删除”
    215      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    216      * @param params 参数
    217      * @param connectTimeout 连接超时时间(单位为ms)
    218      * @param readTimeout 读取超时时间(单位为ms)
    219      * @param charset 字符集(一般该为“utf-8”)
    220      * @return
    221      */
    222     public static String delete(String url, Map params, int connectTimeout, int readTimeout, String charset){
    223         return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.DELETE);
    224     }
    225     
    226     /**
    227      * DELETE方法提交Http请求,语义为“删除”
    228      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    229      * @param params 参数
    230      * @param headers 请求头参数
    231      * @param connectTimeout 连接超时时间(单位为ms)
    232      * @param readTimeout 读取超时时间(单位为ms)
    233      * @param charset 字符集(一般该为“utf-8”)
    234      * @return
    235      */
    236     public static String delete(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
    237         return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.DELETE);
    238     }
    239     
    240     /**
    241      * HEAD方法提交Http请求,语义同GET方法  <br/>
    242      * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
    243      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    244      * @param params 参数
    245      * @param connectTimeout 连接超时时间(单位为ms)
    246      * @param readTimeout 读取超时时间(单位为ms)
    247      * @param charset 字符集(一般该为“utf-8”)
    248      * @return
    249      */
    250     public static String head(String url, Map params, int connectTimeout, int readTimeout, String charset){
    251         return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.HEAD);
    252     }
    253     
    254     /**
    255      * HEAD方法提交Http请求,语义同GET方法  <br/>
    256      * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
    257      * @param url 资源路径(如果url中已经包含参数,则params应该为null)
    258      * @param params 参数
    259      * @param headers 请求头参数
    260      * @param connectTimeout 连接超时时间(单位为ms)
    261      * @param readTimeout 读取超时时间(单位为ms)
    262      * @param charset 字符集(一般该为“utf-8”)
    263      * @return
    264      */
    265     public static String head(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
    266         return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.HEAD);
    267     }
    268     
    269     public static void main(String[] args) {
    270         //Map params = new HashMap();
    271         //params.put("phoneNo", "中文");
    272         //String str = HttpUtil.get("http://localhost:9092/elis_smp_als_dmz/do/app/activitySupport/demo", params, 3000, 3000, "UTF-8");
    273         //System.out.println(str);
    274     }
    275 
    276 }
  • 相关阅读:
    推销员问题
    string类实现
    链表倒数第k个节点
    设计模式之单例模式大全
    空类 sizeof 为什么是1
    类的三种继承方式
    单例模式典型创建方法(三种)
    虚函数实现
    链表删除结点
    TCP的状态转移
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/9306547.html
Copyright © 2011-2022 走看看