Java網路連接之HttpURLConnection、HttpsURLConnection

來源:互聯網
上載者:User

標籤:string   throw   ade   char   turn   內容   ora   nec   tcp串連   

工具類包含兩個方法: http請求、https請求

直接看代碼:

package com.jtools;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ConnectException;import java.net.HttpURLConnection;import java.net.URL;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;/** * http工具類 * @author json_wang*/public class HttpUtil {/** * 發起http請求並擷取結果 * @param requestUrl 請求地址 * @param requestMethod 請求方式(GET、POST) * @param outputStr 提交的資料       格式(例子:"name=name&age=age")  // 本文,本文內容其實跟get的URL中 ‘? ‘後的參數字串一致 * @return json字串(json格式不確定 可能是JSONObject,也可能是JSONArray,這裡用字串,在controller裡再轉化) */public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {String resultStr = "";StringBuffer buffer = new StringBuffer();try {URL url = new URL(requestUrl);HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 佈建要求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);//HttpURLConnection是基於HTTP協議的,其底層通過socket通訊實現。如果不設定逾時(timeout),在網路異常的情況下,可能會導致程式僵死而不繼續往下執行httpUrlConn.setConnectTimeout(30*1000);//30s逾時httpUrlConn.setReadTimeout(10*1000);//10s逾時/*//佈建要求屬性    httpUrlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");     httpUrlConn.setRequestProperty("Charset", "UTF-8");    */        //HttpURLConnection的connect()函數,實際上只是建立了一個與伺服器的tcp串連,並沒有實際發送http請求。//get方式需要顯式串連if ("GET".equalsIgnoreCase(requestMethod)){httpUrlConn.connect();}//這種post方式,隱式自動連接// 當有資料需要提交時if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意編碼格式,防止中文亂碼outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 將返回的輸入資料流轉換成字串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 釋放資源inputStream.close();inputStream = null;httpUrlConn.disconnect();resultStr = buffer.toString();} catch (ConnectException ce) {System.out.println("server connection timed out.");} catch (Exception e) {System.out.println(requestUrl+" request error:\n"+e);}return resultStr;}/** * 發起https請求並擷取結果 *  * @param requestUrl 請求地址 * @param requestMethod 請求方式(GET、POST) * @param outputStr 提交的資料       格式(例子:"name=name&age=age")  // 本文,本文內容其實跟get的URL中 ‘? ‘後的參數字串一致 * @return json字串(json格式不確定 可能是JSONObject,也可能是JSONArray,這裡用字串,在controller裡再轉化) */public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {String resultStr = "";StringBuffer buffer = new StringBuffer();try {// 建立SSLContext對象,並使用我們指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 從上述SSLContext對象中得到SSLSocketFactory對象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 佈建要求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);//HttpURLConnection是基於HTTP協議的,其底層通過socket通訊實現。如果不設定逾時(timeout),在網路異常的情況下,可能會導致程式僵死而不繼續往下執行httpUrlConn.setConnectTimeout(30*1000);//30s逾時httpUrlConn.setReadTimeout(10*1000);//10s逾時/*//佈建要求屬性    httpUrlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");     httpUrlConn.setRequestProperty("Charset", "UTF-8");    */        //HttpURLConnection的connect()函數,實際上只是建立了一個與伺服器的tcp串連,並沒有實際發送http請求。//get方式需要顯式串連if ("GET".equalsIgnoreCase(requestMethod)){httpUrlConn.connect();}//這種post方式,隱式自動連接// 當有資料需要提交時if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意編碼格式,防止中文亂碼outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 將返回的輸入資料流轉換成字串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 釋放資源inputStream.close();inputStream = null;httpUrlConn.disconnect();resultStr = buffer.toString();} catch (ConnectException ce) {System.out.println("server connection timed out.");} catch (Exception e) {System.out.println(requestUrl+" request error:\n"+e);}return resultStr;}public static void main(String[] args) {System.out.println(httpRequest("https://www.zhihu.com/", "GET", null));}}

輔助類:

package com.jtools;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/** * 認證信任管理器(用於https請求) */public class MyX509TrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}}

 

附:原始碼:https://github.com/JsonShare/JTools

 

PS:Java網路連接之HttpURLConnection與HttpClient 區別及聯絡 http://blog.csdn.net/wszxl492719760/article/details/8522714

       

Java網路連接之HttpURLConnection、HttpsURLConnection

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.