HttpURLConnection的使用 html
/*java
* URL請求的類別分爲二類,GET與POST請求。兩者的區別在於: json
* a:) get請求能夠獲取靜態頁面,也能夠把參數放在URL字串後面,傳遞給servlet, 緩存
* b:) post與get的不一樣之處在於post的參數不是放在URL字串裏面,而是放在http請求的正文內。服務器
*/網絡
// url對象表示的是一個指定的資源app
URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");tcp
// url對象的openConnection() 方法返回一個HttpURLConnection 對象,這個對象表示應用程序和url之間的通訊鏈接函數
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();post
// 設置是否向httpUrlConnection輸出,由於這個是post請求,參數要放在
// http正文內,所以須要設爲true, 默認狀況下是false;
urlConn.setDoOutput(true);
// 設置是否從httpUrlConnection讀入,默認狀況下是true;
urlConn.setDoInput(true);
// Post 請求不能使用緩存
urlConn.setUseCaches(false);
// 設定傳送的內容類型是可序列化的java對象
// (若是不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException)
urlConn.setRequestProperty("Content-type","application/x-java-serialized-object");
// 設定請求的方法爲"POST",默認是GET
urlConn.setRequestMethod("POST");
//創建和遠程實際資源之間的實際鏈接,上面的這些屬性要在connect()方法調用以前設置
urlConn.connect();
// 此處getOutputStream會隱含的進行connect (即:如同調用上面的connect()方法,若是是使用post請求
//能夠不寫urlConn.connect();
OutputStream outStrm = urlConn.getOutputStream();
// 如今經過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。
ObjectOutputStream oos = new ObjectOutputStream(outStrm);
// 向對象輸出流寫出數據,這些數據將存到內存緩衝區中
oos.writeObject(new String("我是測試數據"));
// 刷新對象輸出流,將任何字節都寫入潛在的流中(些處爲ObjectOutputStream)
oos.flush();
// 關閉流對象。此時,不能再向對象輸出流寫入任何數據,先前寫入的數據存在於內存緩衝區中,
// 再調用下邊的getInputStream()函數時才把準備好的http請求正式發送到服務器
oos.close();
// 調用HttpURLConnection鏈接對象的getInputStream()函數,
// 將內存緩衝區中封裝好的完整的HTTP請求電文發送到服務端。
InputStream inStrm = urlConn.getInputStream(); // <===注意,實際發送請求的代碼段就在這裏
//----------------------------------
/*
* Post傳參的方法
*/
OutputStream os = urlConn.getOutputStream();
String param = new String();
param = "CorpID=123&LoginName=qqq&name=" + URLEncoder.encode("漢字","GBK"); ;
os.write(param.getBytes());
//----------------------------------
/*
* 超時設置,防止 網絡異常的狀況下,可能會致使程序僵死而不繼續往下執行
*/
//JDK 1.5之前的版本,只能經過設置這兩個系統屬性來控制網絡超時:
//鏈接主機的超時時間(單位:毫秒)
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
//從主機讀取數據的超時時間(單位:毫秒)
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
//在JDK 1.5之後能夠這樣來設置超時時間
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
//----------------------------------
/*
* 總結:
* HttpURLConnection的connect()函數,實際上只是創建了一個與服務器的tcp鏈接,並無實際發送http請求。
* 不管是post仍是get,http請求實際上直到HttpURLConnection的getInputStream()這個函數裏面才正式發送出去。
*
* 對HttpURLConnection對象的一切配置都必需要在connect()函數執行以前完成。
* 而對outputStream的寫操做,又必需要在inputStream的讀操做以前。
* 這些順序其實是由http請求的格式決定的。
*
* 在http頭後面緊跟着的是http請求的正文,正文的內容是經過outputStream流寫入的,
* 實際上outputStream不是一個網絡流,充其量是個字符串流,往裏面寫入的東西不會當即發送到網絡,
* 而是存在於內存緩衝區中,待outputStream流關閉時,根據輸入的內容生成http正文。
* 至此,http請求的東西已經所有準備就緒。在getInputStream()函數調用的時候,就會把準備好的http請求
* 正式發送到服務器了,而後返回一個輸入流,用於讀取服務器對於這次http請求的返回信息。因爲http
* 請求在getInputStream的時候已經發送出去了(包括http頭和正文),所以在getInputStream()函數
* 以後對connection對象進行設置(對http頭的信息進行修改)或者寫入outputStream(對正文進行修改)
* 都是沒有意義的了,執行這些操做會致使異常的發生。
*
*/
*****************************urlconnection get請求實例*******************
一、請求端代碼
try{
// 請求地址
String parm="http://localhost:8080/music/user/delete.do?id=110&name=name";
// 建立url
URL url= new URL(parm);
// 使用httpurlconnection 進行請求的發送
HttpURLConnection con = (HttpURLConnection)url.openConnection();
// 設置相關屬性,若是是post請求 請求參數在正文中因此容許輸出流,若是是get 請求不用輸出了由於參數是在url以後
con.setDoOutput(false);
// 響應數據的接受,因此咱們要容許輸入流
con.setDoInput(true);
// 設置是否要緩存
con.setUseCaches(false);
//Java對象的序列化,進行流的傳遞
//con.setRequestProperty(URLEncoder.encode("Content-type","UTF-8"),URLEncoder.encode("application/x-java-serialized-object","UTF-8"));
// 設置請求方式
con.setRequestMethod("GET");
//上面這些都是請求的一些屬性的配置,也就是規則的定製
//創建一個tcp鏈接
con.connect();
// 接收請求響應數據
InputStream inStrm = con.getInputStream();
byte[] buffer= new byte[1024];
inStrm.read(buffer);
// 編碼設置
String body= new String(buffer,"UTF-8");
System.out.println("返回內容"+body.toString());
}catch(Exception e){
e.printStackTrace();
}
二、服務器端代碼
// 完整的請求路徑:url=http://localhost:8080/music/user/delete.do
@RequestMapping(value="/delete.do")
public void delete(String id,String name,HttpServletResponse response,HttpServletRequest request){
System.out.println("請求到達 delete");
//userService.delUser(id);
String yid= id;
String yname=name;
System.out.println("請求參數id"+yid);
System.out.println("請求參數name:"+name);
try {
// 請求響應數據
OutputStream output= response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
// 這裏傳遞一個json 格式數據
JSONObject json= new JSONObject();
json.put("id", 10);
json.put("name", "name");
String jstring= json.toString();
byte [] b= jstring.getBytes("UTF-8");
output.write(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
*****************************urlconnection post請求實例*******************
一、請求代碼:
try{
// 建立url
URL url= new URL("http://localhost:8080/music/user/delete.do");
// 使用httpurlconnection 進行請求的發送
HttpURLConnection con = (HttpURLConnection)url.openConnection();
// 設置相關屬性,若是是post請求 請求參數在正文中因此容許輸出流,若是是get 請求不用輸出了由於參數是在url以後
con.setDoOutput(true);
// 響應數據的接受,因此咱們要容許輸入流
con.setDoInput(true);
// 設置是否要緩存
con.setUseCaches(false);
//Java對象的序列化,進行流的傳遞
//con.setRequestProperty(URLEncoder.encode("Content-type","UTF-8"),URLEncoder.encode("application/x-java-serialized-object","UTF-8"));
// 設置請求方式
con.setRequestMethod("POST");
//上面這些都是請求的一些屬性的配置,也就是規則的定製
//創建一個tcp鏈接
con.connect();
// 執行 tcp的鏈接上面的connect() 能夠不執行
OutputStream outStrm = con.getOutputStream();
//如今經過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。
ObjectOutputStream oos = new ObjectOutputStream(outStrm);
// 請求參數,post請求的參數在實體中因此使用這種方式
String param = new String();
// 請求參數這裏 id前面沒有& id取 不到這是爲何?、
param ="&id=123&name=王海東";
byte [] b=param.getBytes("UTF-8");
// 將請求參數寫到緩存中
oos.writeObject(b);
//刷新流
oos.flush();
// 關閉流,釋放資源
oos.close();
// 接收請求響應數據,其實http在這是才發送
InputStream inStrm = con.getInputStream();
byte[] buffer= new byte[1024];
inStrm.read(buffer);
// 編碼設置
String body= new String(buffer,"UTF-8");
System.out.println("返回內容"+body.toString());
}catch(Exception e){
e.printStackTrace();
}
2、服務器代碼:
@RequestMapping(value="/delete.do")
public void delete(String id,String name,HttpServletResponse response,HttpServletRequest request){
System.out.println("請求到達 delete");
//userService.delUser(id);
String yid= id;
String yname=name;
System.out.println("請求參數id"+yid);
System.out.println("請求參數name:"+name);
try {
// 響應輸出流
OutputStream output= response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
// 這裏傳遞一個json 格式數據
JSONObject json= new JSONObject();
json.put("id", 10);
json.put("name", "name");
String jstring= json.toString();
byte [] b= jstring.getBytes("UTF-8");
output.write(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}