經過java.net.URLConnection發送HTTP請求的方法

一、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();
	}
}
相關文章
相關標籤/搜索