【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, Mapheaders, int connectTimeout, int readTimeout, String encoding, HttpMethod method) { 27 //构造请求参数字符串 28 StringBuilder paramsStr = null; 29 if (params != null) { 30 paramsStr = new StringBuilder(); 31 Set 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 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请求,语义为“增加”
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请求,语义为“增加”
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, Mapheaders, 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 headers, int connectTimeout, int readTimeout, String charset) { 178 return invokeUrl(url, params, headers, connectTimeout, readTimeout, charset, HttpMethod.GET); 179 } 180 181 /** 182 * PUT方法提交Http请求,语义为“更改”
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请求,语义为“更改”
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, Mapheaders, 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 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方法
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方法
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, Mapheaders, 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文件导包:
com.alibaba fastjson 1.2.21
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 staticString 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 parseJsonToObj(String json, Class 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 }
关于工具类的方法调用 上面我已经说了,这个不用我说了吧
恭喜 解析成功