httpurlconnection 訪問https

1.HttpClient和httpurlconnection介紹
HttpClient是Apache開源組織提供的一個Http客戶端,HttpClient封裝了Session、Cookie等細節問題的處理。簡單來講,HttpClient就是一個加強版的HttpURLConnection,HttpURLConnection能夠作的事情 HttpClient所有能夠作;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關注於如何發送請求、接收響應,以及管理HTTP鏈接。因爲HttpClient API較多,體型較大升級和維護起來較爲繁瑣,Android團隊在API 23中移除了對HttpClient的支持。
2.HttpURLConnection是java的標準類,沒有作封裝,用起來比較原始java

使用httpurlconnection實現get,post請求:json

get請求傳參:參數跟在url後api

post請求傳參:將參數放入輸出流中app

public static String httpUrlConnectionGet(參數) throws Throwable {
		String result = null;
		try {
				trustAllHosts();
			URL serverUrl = new URL(params);
			
			HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection();
			conn.setRequestMethod("GET");
			conn.setRequestProperty("Content-type", "application/json");
			conn.setConnectTimeout(connectTimeout);
			conn.setInstanceFollowRedirects(false);
			conn.connect();
			if (conn.getResponseCode() == 200) {
				result = getReturn(conn);
			} else {
				logger.error("Return to Data is wrong");
			}
			logger.info("httpUrlConnectionget method end");
		} catch (IOException e) {
			logger.error(e.getMessage());
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return result;
	}

    其中trustAllHosts();方法是跳過https證書,能夠進行無證書訪問dom

private static void trustAllHosts() {
		TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return new java.security.cert.X509Certificate[] {};
			}

			@Override
			public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
					throws CertificateException {
			}

			@Override
			public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
					throws CertificateException {
			}
		} };

		// Install the all-trusting trust manager
		try {
			SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE");
			sc.init(null, trustAllCerts, new java.security.SecureRandom());
			HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
			HttpsURLConnection.setDefaultHostnameVerifier(NoopHostnameVerifier.INSTANCE);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

httpURLconnection post方法請求apiide

public static String httpUrlConnectionPost(String params, String requestUrl, String profilesActive) throws Throwable {
		String result = null;
		try {
			if ("alpha".equals(profilesActive)) {
				trustAllHosts();
			}
			URL serverUrl = new URL(requestUrl);
			logger.info(serverUrl.toString());
			logger.info("httpUrlConnectionPost method start");
			HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection();
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setConnectTimeout(connectTimeout);
			conn.setInstanceFollowRedirects(false);
			conn.setDoOutput(true);
			conn.connect();
			DataOutputStream out = new DataOutputStream(conn.getOutputStream());
			logger.info(params);
			out.writeBytes(params);
			out.flush();
			out.close();
			if (conn.getResponseCode() == 200) {
				result = getReturn(conn);
			} else {
				logger.error("Return to Data is wrong");
			}
			Integer code = conn.getResponseCode();
			logger.info(code.toString());
			result = getReturn(conn);
			logger.info("httpUrlConnectionPost method end");
		} catch (IOException e) {
			logger.error(e.getMessage());
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return result;
	}

因爲httpurlconnection是以輸入輸出流的形式進行數據傳輸,因此接到返回值須要轉換成Sting字符串,使用obectMapper進行解析獲得map,進而獲得想要的數據。工具

public static String getReturn(HttpURLConnection connection) throws IOException {
		StringBuffer buffer = new StringBuffer();
		try (InputStream inputStream = connection.getInputStream();
				InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
				BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {
			String str = null;
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}
			String result = buffer.toString();
			return result;
		}
	}

json解析:oop

public class JsonToMapUtil {
	public static Map<String, Object> getMap(String result) throws Exception{
	     ObjectMapper mapper = new ObjectMapper();
	     Map<String, Object> mapperMap = new HashMap<String, Object>();
	     Map<String, Object> data = mapper.readValue(result, mapperMap.getClass());
		 return data;		
	}
}

https證書:post

http+ssl:證書一共分爲兩種,一種是域名申請證書,還有一種是IP申請證書url

有一種狀況是請求https的api,使用ip仍是域名的url去申請是由證書屬於哪一種所決定的,若是是ip申請證書而且沒有域名,那麼就算是本身本地配置hosts域名,也是行不通的。可是大部分正式環境都是帶有域名的

注意:

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
中的類型若是錯誤則會出現傳參失敗的狀況。

小細節:

若是把此類定義爲一個工具類,那麼方法都要用static修飾

基礎:每一個線程都有本身的線程棧,棧與線程同時建立,每個虛擬機線程都有本身的程序計數器PC,在任什麼時候刻,一個虛擬機線程只會執行一個方法的代碼,這個方法稱爲該線程的當前方法,若是這個方法不是native的,程序計數器就保存虛擬機正在執行的字節碼指令的地址。線程調用方法的時候會建立棧幀,用於保存局部變量表和操做數棧以及指向該類常量池的引用 
靜態方法雖然是同一個方法,可是不一樣線程在調用,程序計數器的值是不同的,操做這兩個線程不會相互影響(假設不存在訪問共享變量的狀況) 
1.保證不依靠其餘類、屬性、方法等 
2.不須要考慮方法同步 
3. 若是使用單例類,須要考慮線程同步的狀況,這是工具類不使用單例的緣由

這裏還有一點須要補充:在寫工具類時,最好是將其構造方法私有化,避免意外的初始化類,作無心義的工做

其中單例和多例概念:

http://www.javashuo.com/article/p-eafsogek-do.html

這篇文章介紹的很清晰

相關文章
相關標籤/搜索