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

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

恭喜 解析成功