HttpURLConnection:
每個 HttpURLConnection實例都可用於生成單個請求,但是其他實例可以透明地共享連接到 HTTP 服務器的基礎網絡。請求后在 HttpURLConnection 的 InputStream 或 OutputStream 上調用 close() 方法可以釋放與此實例關聯的網絡資源,但對共享的持久連接沒有任何影響。如果在調用 disconnect() 時持久連接空閑,則可能關閉基礎套接字
HttpURLConnection的父類是URLConnection
今天寫此文章的目的是由於工作中遇到ajax請求獲取數據時碰到瀏覽器的跨域問題(由於javascript的同源策略導致的,同源就是兩個頁面有相同的協議、端口和主機),由於我們這邊屬於客戶端,無法修改服務端代碼,所以更改了請求方式,利用HttpURLConnection成功的解決跨域問題
1.生成HttpURLConnection對象
URL postUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection)postUrl.openConnection();
創建URL對象,通過openConnection方法創建URLConnection對象並強制轉化成HttpURLConnection對象
2.設置對應的方法參數,其中setRequestMethod為HttpURLConnection自有的方法
conn.setConnectTimeout(20000); conn.setReadTimeout(30000); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(true); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestMethod("GET");
conn.connect();
3.獲取請求數據
StringBuffer sb = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); String line = ""; try{ while((line = reader.readLine()) !=null){ sb.append(line); } }catch(IOException e){ e.printStackTrace(); } try{ reader.close(); }catch(Exception e){ e.printStackTrace(); } conn.disconnect();
return sb.toString();
此次沒有傳參,直接通過getInputStream打開鏈接讀取的輸入流,並通過BufferedReader高級流讀取數據,一行一行的append到StringBuffer中,成功獲取數據。
如果需要傳入對應的參數要用到PrintWriter的print方法
PrintWriter osw = new PrintWriter(conn.getOutputStream()); osw.print(param); osw.flush();//刷新此流的緩沖 osw.close();