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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM