2012年7月26日 星期四

使用 Java 發送 HTTP Request

要在程式裡面模擬瀏覽器的行為是很常見的需求
不管是要做爬蟲,還是是要無縫連接網際網路的服務,都需要利用程式來實作瀏覽器的動作。
雖然上週才剛發一篇 Android HTTP POST
但因為 Android 函式庫本身已經內含 Apache 的 HttpClient 套件,所以實作起來稍微簡單一點
而在純 Java Application 的環境中,如果沒辦法用 Apache 的套件的話,就必須自己用別的方法處理了。

參考資料:
1、java HttpURLConnection來實作get及post動作
2、HTTPURLConnection

從參考資料可以看出,純 Java 環境是可以利用 HttpUrlConnection 來實作。
以下是範例程式:
HttpUrlPost.java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;

public class HttpUrlPost {
  public String postData (String url, String contentType, String data) throws MalformedURLException, IOException {
    URL endpoint = new URL(url);
    HttpURLConnection httpConnection = (HttpURLConnection) endpoint.openConnection();
    httpConnection.setRequestMethod("POST");
    httpConnection.setDoInput(true);
    httpConnection.setDoOutput(true);
    httpConnection.setRequestProperty("Content-Type", contentType);
    
    // Add post data
    if(data != null && data.length() > 0) {
      httpConnection.setRequestProperty("Content-Length", String.valueOf(data.length()));
      
      DataOutputStream dos = null;
      try {
        dos = new DataOutputStream(httpConnection.getOutputStream());
        // Use utf-8 encoding for the post data.
        dos.write(data.getBytes(Charset.forName("utf-8")));
        dos.flush();
      } finally {
        if(dos != null) dos.close();
      }
    }
    
    // Read the response from server
    InputStreamReader isr = null;
    BufferedReader br = null;
    String line = null;
    StringBuilder sb = new StringBuilder();
    try {
      isr = new InputStreamReader(httpConnection.getInputStream());
      br = new BufferedReader(isr);
      while( (line = br.readLine()) != null ) {
        sb.append(line);
      }
    } finally {
      if(br != null) br.close();
      if(isr != null) isr.close();
    }
    return sb.toString();
  }
}

這裡是直接假設要送的是 POST 的 request,然後強制用 UTF-8 編碼來轉譯要送的 POST 字串。
要呼叫的時候,假設要送的 POST 資料是 JSON 的字串,可以用下面的方式呼叫。
// Url which the request is sent to
String url = "http://www.google.com/";
// JSON format string which will be attached in the POST request
JSONObject requestJSON = new JSONObject();
requestJSON.put("statuscode", 200);
// Send the request
HttpUrlPost post = new HttpUrlPost();
Strin response = httpPost.postData(url, "application/json", requestJSON.toString());

沒有留言: