HttpURLConnection的使用

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();

}

}

相關文章
相關標籤/搜索