【Htpp工具類更新/2019-12-17】:增加多種調用方法,以及請求頭調用等等
最近公司給了一個第三方服務的網址,要我調用后返回需要用到的信息
具體網址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + userId+ "&type=1&sceneId=sceneld
直接再網頁上顯示:
{"longTable":[{"labelName":"message","labelValue":"1507.68","unit":"M"}],"customGroup":[],"crossTable":[]}
后台需要獲取並解析
說一下我的實現思路:用http獲取頁面信息
為方便起見,我把這個封裝成一個工具類了
接下來,獻上我的工具類,工具類已更新2019-12-17,增強版,重新錄入許多方法
1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 import java.io.*; 4 import java.net.HttpURLConnection; 5 import java.net.URL; 6 import java.util.Map; 7 import java.util.Set; 8 9 /** 10 * @author wusiwee 11 * @date 2019/12/17 16:50 12 */ 13 public class HttpUtil { 14 15 private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class); 16 17 18 /** 19 * 支持的Http method 20 */ 21 private static enum HttpMethod { 22 POST, DELETE, GET, PUT, HEAD 23 } 24 25 @SuppressWarnings({"unchecked", "rawtypes"}) 26 private static String invokeUrl(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String encoding, HttpMethod method) { 27 //構造請求參數字符串 28 StringBuilder paramsStr = null; 29 if (params != null) { 30 paramsStr = new StringBuilder(); 31 Set<Map.Entry> entries = params.entrySet(); 32 for (Map.Entry entry : entries) { 33 String value = (entry.getValue() != null) ? (String.valueOf(entry.getValue())) : ""; 34 paramsStr.append(entry.getKey() + "=" + value + "&"); 35 } 36 //只有POST方法才能通過OutputStream(即form的形式)提交參數 37 if (method != HttpMethod.POST) { 38 url += "?" + paramsStr.toString(); 39 } 40 } 41 42 URL uUrl = null; 43 HttpURLConnection conn = null; 44 BufferedWriter out = null; 45 BufferedReader in = null; 46 try { 47 //創建和初始化連接 48 uUrl = new URL(url); 49 conn = (HttpURLConnection) uUrl.openConnection(); 50 conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 51 conn.setRequestMethod(method.toString()); 52 conn.setDoOutput(true); 53 conn.setDoInput(true); 54 //設置連接超時時間 55 conn.setConnectTimeout(connectTimeout); 56 //設置讀取超時時間 57 conn.setReadTimeout(readTimeout); 58 //指定請求header參數 59 if (headers != null && headers.size() > 0) { 60 Set<String> headerSet = headers.keySet(); 61 for (String key : headerSet) { 62 conn.setRequestProperty(key, headers.get(key)); 63 } 64 } 65 66 if (paramsStr != null && method == HttpMethod.POST) { 67 //發送請求參數 68 out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), encoding)); 69 out.write(paramsStr.toString()); 70 out.flush(); 71 } 72 73 //接收返回結果 74 StringBuilder result = new StringBuilder(); 75 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), encoding)); 76 if (in != null) { 77 String line = ""; 78 while ((line = in.readLine()) != null) { 79 result.append(line); 80 } 81 } 82 return result.toString(); 83 } catch (Exception e) { 84 logger.error("調用接口[" + url + "]失敗!請求URL:" + url + ",參數:" + params, e); 85 //處理錯誤流,提高http連接被重用的幾率 86 try { 87 byte[] buf = new byte[100]; 88 InputStream es = conn.getErrorStream(); 89 if (es != null) { 90 while (es.read(buf) > 0) { 91 ; 92 } 93 es.close(); 94 } 95 } catch (Exception e1) { 96 e1.printStackTrace(); 97 } 98 } finally { 99 try { 100 if (out != null) { 101 out.close(); 102 } 103 } catch (Exception e) { 104 e.printStackTrace(); 105 } 106 try { 107 if (in != null) { 108 in.close(); 109 } 110 } catch (Exception e) { 111 e.printStackTrace(); 112 } 113 //關閉連接 114 if (conn != null) { 115 conn.disconnect(); 116 } 117 } 118 return null; 119 } 120 121 /** 122 * POST方法提交Http請求,語義為“增加” <br/> 123 * 注意:Http方法中只有POST方法才能使用body來提交內容 124 * 125 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 126 * @param params 參數 127 * @param connectTimeout 連接超時時間(單位為ms) 128 * @param readTimeout 讀取超時時間(單位為ms) 129 * @param charset 字符集(一般該為“utf-8”) 130 * @return 131 */ 132 public static String post(String url, Map params, int connectTimeout, int readTimeout, String charset) { 133 return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.POST); 134 } 135 136 /** 137 * POST方法提交Http請求,語義為“增加” <br/> 138 * 注意:Http方法中只有POST方法才能使用body來提交內容 139 * 140 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 141 * @param params 參數 142 * @param headers 請求頭參數 143 * @param connectTimeout 連接超時時間(單位為ms) 144 * @param readTimeout 讀取超時時間(單位為ms) 145 * @param charset 字符集(一般該為“utf-8”) 146 * @return 147 */ 148 public static String post(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) { 149 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.POST); 150 } 151 152 /** 153 * GET方法提交Http請求,語義為“查詢” 154 * 155 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 156 * @param params 參數 157 * @param connectTimeout 連接超時時間(單位為ms) 158 * @param readTimeout 讀取超時時間(單位為ms) 159 * @param charset 字符集(一般該為“utf-8”) 160 * @return 161 */ 162 public static String get(String url, Map params, int connectTimeout, int readTimeout, String charset) { 163 return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.GET); 164 } 165 166 /** 167 * GET方法提交Http請求,語義為“查詢” 168 * 169 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 170 * @param params 參數 171 * @param headers 請求頭參數 172 * @param connectTimeout 連接超時時間(單位為ms) 173 * @param readTimeout 讀取超時時間(單位為ms) 174 * @param charset 字符集(一般該為“utf-8”) 175 * @return 176 */ 177 public static String get(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) { 178 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.GET); 179 } 180 181 /** 182 * PUT方法提交Http請求,語義為“更改” <br/> 183 * 注意:PUT方法也是使用url提交參數內容而非body,所以參數最大長度收到服務器端實現的限制,Resin大概是8K 184 * 185 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 186 * @param params 參數 187 * @param connectTimeout 連接超時時間(單位為ms) 188 * @param readTimeout 讀取超時時間(單位為ms) 189 * @param charset 字符集(一般該為“utf-8”) 190 * @return 191 */ 192 public static String put(String url, Map params, int connectTimeout, int readTimeout, String charset) { 193 return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.PUT); 194 } 195 196 /** 197 * PUT方法提交Http請求,語義為“更改” <br/> 198 * 注意:PUT方法也是使用url提交參數內容而非body,所以參數最大長度收到服務器端實現的限制,Resin大概是8K 199 * 200 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 201 * @param params 參數 202 * @param headers 請求頭參數 203 * @param connectTimeout 連接超時時間(單位為ms) 204 * @param readTimeout 讀取超時時間(單位為ms) 205 * @param charset 字符集(一般該為“utf-8”) 206 * @return 207 */ 208 public static String put(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) { 209 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.PUT); 210 } 211 212 /** 213 * DELETE方法提交Http請求,語義為“刪除” 214 * 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 * 229 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 230 * @param params 參數 231 * @param headers 請求頭參數 232 * @param connectTimeout 連接超時時間(單位為ms) 233 * @param readTimeout 讀取超時時間(單位為ms) 234 * @param charset 字符集(一般該為“utf-8”) 235 * @return 236 */ 237 public static String delete(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) { 238 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.DELETE); 239 } 240 241 /** 242 * HEAD方法提交Http請求,語義同GET方法 <br/> 243 * 跟GET方法不同的是,用該方法請求,服務端不返回message body只返回頭信息,能節省帶寬 244 * 245 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 246 * @param params 參數 247 * @param connectTimeout 連接超時時間(單位為ms) 248 * @param readTimeout 讀取超時時間(單位為ms) 249 * @param charset 字符集(一般該為“utf-8”) 250 * @return 251 */ 252 public static String head(String url, Map params, int connectTimeout, int readTimeout, String charset) { 253 return invokeUrl(url, params, null, connectTimeout, readTimeout, charset, HttpMethod.HEAD); 254 } 255 256 /** 257 * HEAD方法提交Http請求,語義同GET方法 <br/> 258 * 跟GET方法不同的是,用該方法請求,服務端不返回message body只返回頭信息,能節省帶寬 259 * 260 * @param url 資源路徑(如果url中已經包含參數,則params應該為null) 261 * @param params 參數 262 * @param headers 請求頭參數 263 * @param connectTimeout 連接超時時間(單位為ms) 264 * @param readTimeout 讀取超時時間(單位為ms) 265 * @param charset 字符集(一般該為“utf-8”) 266 * @return 267 */ 268 public static String head(String url, Map params, Map<String, String> headers, int connectTimeout, int readTimeout, String charset) { 269 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.HEAD); 270 } 271 272 public static void main(String[] args) { 273 //Map params = new HashMap(); 274 //params.put("phoneNo", "中文"); 275 //String str = HttpUtil.get("http://localhost:9092/elis_smp_als_dmz/do/app/activitySupport/demo", params, 3000, 3000, "UTF-8"); 276 //System.out.println(str); 277 } 278 279 }
方法我已經聲明為static,調用直接 類名.方法名 HttpUtil.getURLContent(String URL);
就直接返回字符串了
若要json字符串與java對象進行相互轉換,我使用的fastjson轉換,再獻上我的工具類
pom文件導包:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.21</version> </dependency>
JsonUtil的工具類:

1 import com.alibaba.fastjson.JSON; 2 import com.alibaba.fastjson.JSONObject; 3 4 public final class JsonUtils { 5 /** 6 * 把Java對象轉換成json字符串 7 * 8 * @param object 待轉化為JSON字符串的Java對象 9 * @return json 串 or null 10 */ 11 public static <T> String parseObjToJson(T object) { 12 String string = null; 13 try { 14 //string = JSON.toJSONString(object); 15 string = JSONObject.toJSONString(object); 16 } catch (Exception e) { 17 System.out.println(e.getMessage()); 18 } 19 return string; 20 } 21 22 /** 23 * 將Json字符串信息轉換成對應的Java對象 24 * 25 * @param json json字符串對象 26 * @param c 對應的類型 27 */ 28 public static <T> T parseJsonToObj(String json, Class<T> c) { 29 try { 30 //兩個都是可行的,起碼我測試的時候是沒問題的。 31 //JSONObject jsonObject = JSONObject.parseObject(json); 32 JSONObject jsonObject = JSON.parseObject(json); 33 return JSON.toJavaObject(jsonObject, c); 34 } catch (Exception e) { 35 System.out.println(e.getMessage()); 36 } 37 return null; 38 } 39 40 }
關於工具類的方法調用 上面我已經說了,這個不用我說了吧
恭喜 解析成功