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工具類

關於工具類的方法調用  上面我已經說了,這個不用我說了吧

恭喜 解析成功


免責聲明!

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



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