java使用Http调用第三方接口,输入链接,获取返回值

【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 headers, 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, Map 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 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, Map 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 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, Map 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文件导包:


    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 static  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 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 }
JSONUtil工具类

关于工具类的方法调用  上面我已经说了,这个不用我说了吧

恭喜 解析成功

你可能感兴趣的:(java使用Http调用第三方接口,输入链接,获取返回值)