基于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 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用HttpURLConnection或者HttpClient库来发送HTTP请求和接收HTTP响应。 使用HttpURLConnection发送HTTP请求: ```java import java.net.URL; import java.net.HttpURLConnection; import java.io.BufferedInputStream; import java.io.InputStream; public class HttpHelper { public static String sendGetRequest(String urlString) throws Exception { URL url = new URL(urlString); // 创建URL对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 建立HTTP连接 conn.setRequestMethod("GET"); // 设置请求方法为GET conn.connect(); // 发送请求 int responseCode = conn.getResponseCode(); // 获取HTTP响应码 if (responseCode != 200) { // 处理HTTP错误 throw new Exception("HTTP error code: " + responseCode); } InputStream in = new BufferedInputStream(conn.getInputStream()); // 获取HTTP响应数据流 String response = streamToString(in); // 将HTTP响应数据流转化为字符串 return response; // 返回HTTP响应字符串 } private static String streamToString(InputStream in) throws Exception { StringBuilder sb = new StringBuilder(); // 创建StringBuilder对象 byte[] buffer = new byte[1024]; // 创建一个长度为1024的byte数组 int len = -1; while ((len = in.read(buffer)) != -1) { // 从HTTP响应数据流中读取数据,直到读到末尾 String s = new String(buffer, 0, len, "UTF-8"); // 将读到的数据转化为字符串 sb.append(s); // 使用StringBuilder对象拼接字符串 } return sb.toString(); // 返回拼接好的字符串 } } ``` 使用HttpClient发送HTTP请求: ```java import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; public class HttpHelper { public static String sendGetRequest(String urlString) throws Exception { HttpClient client = HttpClientBuilder.create().build(); // 创建HttpClient对象 HttpGet request = new HttpGet(urlString); // 创建HttpGet对象 HttpResponse response = client.execute(request); // 使用HttpClient对象发送HTTP请求,并获取HttpResponse对象 int statusCode = response.getStatusLine().getStatusCode(); // 获取HTTP响应码 if (statusCode != 200) { // 处理HTTP错误 throw new Exception("HTTP error code: " + statusCode); } String responseString = EntityUtils.toString(response.getEntity(), "UTF-8"); // 将HTTP响应数据转化为字符串 return responseString; // 返回HTTP响应字符串 } } ``` 以上代码只是简单的示例,实际使用中应该加入错误处理和异常处理等内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值