一、GET與POST請求的區別java
a) get請求能夠獲取靜態頁面,也能夠把參數放在URL字串後面,傳遞給servlet, 緩存
b) post與get的不一樣之處在於post的參數不是放在URL字串裏面,而是放在http請求的正文內。 服務器
二、URLConnection的對象網絡
a) 獲取URLConnection實例app
URL url = new URL(urlString); // 根據url生成urlConnection對象 urlConnection = (HttpURLConnection) url.openConnection();
b) 常見參數設置函數
// 設置是否向httpUrlConnection輸出,由於這個是post請求,參數要放在 // http正文內,所以須要設爲true, 默認狀況下是false; httpUrlConnection.setDoOutput(true); // 設置是否從httpUrlConnection讀入,默認狀況下是true; httpUrlConnection.setDoInput(true); // Post 請求不能使用緩存 httpUrlConnection.setUseCaches(false); // 設定傳送的內容類型是可序列化的java對象 // (若是不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException) httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); // 設定請求的方法爲"POST",默認是GET httpUrlConnection.setRequestMethod("POST"); //設置超時(timeout),在網絡異常的狀況下,可能會致使程序僵死而不繼續往下執行。 System.setProperty("sun.net.client.defaultConnectTimeout", 超時毫秒數字符串); System.setProperty("sun.net.client.defaultReadTimeout", 超時毫秒數字符串);
c) HttpURLConnection寫數據與發送數據問題post
// 如今經過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。 OutputStream outStrm = httpUrlConnection.getOutputStream(); ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向對象輸出流寫出數據,這些數據將存到內存緩衝區中 objOutputStrm.writeObject(new String("我是測試數據")); // 刷新對象輸出流,將任何字節都寫入潛在的流中(些處爲ObjectOutputStream) objOutputStm.flush(); // 關閉流對象。此時,不能再向對象輸出流寫入任何數據,先前寫入的數據存在於內存緩衝區中, // 在調用下邊的getInputStream()函數時才把準備好的http請求正式發送到服務器 objOutputStm.close(); // 調用HttpURLConnection鏈接對象的getInputStream()函數, // 將內存緩衝區中封裝好的完整的HTTP請求電文發送到服務端。 InputStream inStrm = httpConn.getInputStream(); // <===注意,實際發送請求的代碼段就在這裏 // 上邊的httpConn.getInputStream()方法已調用,本次HTTP請求已結束,下邊向對象輸出流的輸出已無心義// 既使對象輸出流沒有調用close()方法,下邊的操做也不會向對象輸出流寫入任何數據. // 所以,要從新發送數據時須要從新建立鏈接、從新設參數、從新建立流對象、從新寫數據、 // 從新發送數據(至因而否不用從新這些操做須要再研究) objOutputStm.writeObject(new String("")); httpConn.getInputStream();
三、代碼實例
測試
package org.zhangsm.httpRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; /** * 使用Java原生的API發送Http請求,即java.net.URL、java.net.URLConnection。 * 步驟以下: * 一、經過統一資源定位符獲取鏈接器 * 二、設置請求的參數 * 三、以輸入流的形式獲取返回內容 * 四、關閉輸入流 * @author zhang.shuming * */ public class HttpRequest { public static void main(String[] args) throws Exception { System.out.println(send("http://www.baidu.com", "GET", null, null)); } private static String send(String urlString,String method, Map<String,String> parameters,Map<String,String> propertys) throws Exception{ HttpURLConnection urlConnection = null; if(method.equalsIgnoreCase("GET") && parameters != null){ StringBuffer param = new StringBuffer(); int i = 0; for(String key : parameters.keySet()){ if(i == 0) param.append("?"); else param.append("&"); param.append(key).append("=").append(parameters.get(key)); i++; } urlString += param; } URL url = new URL(urlString); // 根據url生成urlConnection對象 urlConnection = (HttpURLConnection) url.openConnection(); // 設置參數 urlConnection.setRequestMethod(method); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setUseCaches(false); if(propertys != null){ for(String key : propertys.keySet()){ urlConnection.addRequestProperty(key, propertys.get(key)); } } if(method.equalsIgnoreCase("POST") && parameters != null){ StringBuffer param = new StringBuffer(); for(String key : parameters.keySet()){ param.append("&"); param.append(key).append("=").append(parameters.get(key)); } urlConnection.getOutputStream().write(param.toString().getBytes()); urlConnection.getOutputStream().flush(); urlConnection.getOutputStream().close(); } return makeContent(urlString,urlConnection); } private static String makeContent(String urlString,HttpURLConnection urlConnection) throws IOException{ InputStream in = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); StringBuffer temp = new StringBuffer(); String line; while((line = bufferedReader.readLine()) != null){ temp.append(line); } bufferedReader.close(); return temp.toString(); } }