基于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 }
原文地址:https://www.cnblogs.com/suizhikuo/p/9306547.html