2010年9月6日 星期一

Java 網路程式 - 利用 URLConnection 模擬 HTTP request

以下我是利用 JSP 先撰寫一個請求表單(form),再利用 Java 的 java.net.URLConnection

模擬 form 送出的 HTTP 請求和所代之參數,最後在取得回傳網頁的內容。

先來介紹一下 URLConnection 這個抽象類別,首先

它針對了與伺服器(HTTP伺服器)的互動提供了更多的方法和一些控制

通常都是透過 URL 的 openConnection() 取得 URLConnection,例如以下:
try{
     URL url = new URL("http://tw.yahoo.com");
     URLConnection conn = url.openConnection();
}
catch(MalformedURLException e){...}
catch(IOException e){...}

以上只是取得一個建構好的 URLConnection,並不是取得連線

要取得連線必須呼叫 connect() 方法,會拋出 IOException 
接下來看一下程式:


import java.io.*;
import java.net.*;
public class useHttpURLConnection {
    public static void main(String[] args) throws IOException{
        URL myUrl = new URL("http://localhost:8084/Practices/login.jsp");
        //取得 URLConnection    
        HttpURLConnection conn = (HttpURLConnection)myUrl.openConnection();
       
        conn.setDoInput(true);  //設定為可從伺服器讀取資料
        conn.setDoOutput(true);  //設定為可寫入資料至伺服器
        conn.setRequestMethod("GET");  //設定請求方式為 GET
        //以下是設定 MIME 標頭中的 Content-type
        conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 
        conn.connect();  //開始連接
        //透過 URLConnection 的 getOutputStream() 取的 OutputStream, 並建立以UTF-8 為編碼的 OutputStreamWriter
        PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"), true);
        //username和password為請求參數的名稱, args[0]和args[1]為參數值
        out.print("username=" + URLEncoder.encode(args[0]) + "&password=" + URLEncoder.encode(args[1]));
        out.flush();   //記得要清除緩衝區或關閉
        
        //印出伺服器回應訊息
        System.out.println("Response status : " + conn.getResponseMessage());
        System.out.println("************************************");
        String inputLine = "";
        //利用 URLConnection 的 getInputStream() 取得 InputStream
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
        while ((inputLine = reader.readLine()) != null){
            System.out.println(inputLine);  //印出結果  
        }
        reader.close();
  
    }
}

最後再撰寫一份 JSP,以form 的GET送出請求給本頁,並以本頁進行處理,大致內容如下:

//JSP 省略部份.....
<% //這邊是 JSP 的 Scriptlets
    if(request.getParameter("username") != null && request.getParameter("password") != null)
    {
        String user = request.getParameter("username");
        String pawd = request.getParameter("password");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pout = null;
        try{
            pout = response.getWriter();
            //以下是回應的訊息
            pout.println("<p>帳號 : " + user +"</p>");
            pout.println("<p>密碼 : " + pawd +"</p>");
        }catch(Exception e){}
        finally{
            pout.close();
        }
    }
%>
//使用GET //action="" 表示以本頁處理請求
<form action="" method="GET" >  
帳號 : <input type="text" name="username" /><br/>
密碼 : <input type="text" name="password" /><br/>
<input type="submit" value="送出" />
</form>
//JSP 省略部份.....


最後在CMD 下輸入 java useHttpURLConnection ayu780129 123456789
即可看到印出的結果
以下可以看到回傳的文件 將它印出
<p>帳號 :ayu780129</p>
<p>密碼 :123456789</p>














以上 你可以將請求送到另一張 JSP (我是將請求給本頁處理)
或是去網路上找找比較簡單的網站並觀察他的請求參數


並用上述方法模擬也可以

沒有留言:

張貼留言