1. 使用 標准Java接口: 設計的類: java.net.*
基本步驟:
1) 創建 URL 以及 URLConnection / HttpURLConnection 對象
2) 設置連接參數
3) 連接到服務器
4) 向服務器寫數據
5)從服務器讀取數據
例:
try {
// 創建一個 URL 對象
URL url = new URL(your_url);
// 創建一個 URL 連接,如果有代理的話可以指定一個代理。
URLConnection connection = url.openConnection(Proxy_yours);
// 對於 HTTP 連接可以直接轉換成 HttpURLConnection,這樣就可以使用一些 HTTP 連接特定的方法,如 setRequestMethod() 等:
//HttpURLConnection connection =
// (HttpURLConnection)url.openConnection(Proxy_yours);
// 在開始和服務器連接之前,可能需要設置一些網絡參數
connection.setConnectTimeout(10000);
connection.addRequestProperty(“User-Agent”,
“J2me/MIDP2.0″);
// 連接到服務器
connection.connect();
// 與服務器交互:
OutputStream outStream = connection.getOutputStream();
ObjectOutputStream objOutput = new ObjectOutputStream(outStream);
objOutput.writeObject(new String(“this is a string…”));
objOutput.flush();
InputStream in = connection.getInputStream();
// 處理數據
…
} catch (Exception e) {
// 網絡讀寫操作往往會產生一些異常,所以在具體編寫網絡應用時
// 最好捕捉每一個具體以采取相應措施
}
2. 使用 apache 接口:
Apache HttpClient 是一個開源項目,彌補了 java.net.* 靈活性不足的缺點, 支持客戶端的HTTP編程.
使用的類包括: org.apache.http.*
步驟:
1) 創建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等對象;
2) 設置連接參數;
3) 執行 HTTP 操作;
4) 處理服務器返回結果.
例:
try {
// 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)
HttpParams params = new BasicHttpParams();
// 設置連接超時和 Socket 超時,以及 Socket 緩存大小:
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);
// 設置重定向,缺省為 true:
HttpClientParams.setRedirecting(params, true);
// 設置 user agent:
HttpProtocolParams.setUserAgent(params, userAgent);
// 創建一個 HttpClient 實例:
// 注意: HttpClient httpClient = new HttpClient(); 是Commons HttpClient中的用法,
// 在 Android 1.5 中我們需要使用 Apache 的缺省實現 DefaultHttpClient.
DefaultHttpClient httpClient = new DefaultHttpClient(params);
// 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向:
HttpGet httpGet = new HttpGet (“http://www.test_test.com/”);
//執行此方法:
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 錯誤處理,例如可以在該請求正常結束前將其中斷:
httpGet.abort();
}
// 讀取更多信息
Header[] headers = response.getHeaders();
HttpEntity entity = response.getEntity();
Header header = response.getFirstHeader(“Content-Type”);
} catch (Exception ee) {
// …
} finally {
// 釋放連接:
client.getConnectionManager().shutdown();
}
以下例子以 HttpGet 方式通過代理訪問 HTTPS 網站:
try {
HttpClient httpClient = new HttpClient();
// 設置認證的數據: httpClient好像沒有方法getCredentialsProvider()??
httpClient.getCredentialsProvider().setCredentials(
new AuthScope(“your_auth_host”, 80, “your_realm”),
new UsernamePasswordCredentials(“username”, “password”));
// 設置服務器地址,端口,訪問協議:
HttpHost targetHost = new HttpHost(“www.verisign.com”, 443, “https”);
// 設置代理:
HttpHost proxy = new HttpHost(“192.168.1.1″, 80);
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
// 創建一個 HttpGet 實例:
HttpGet httpGet = new HttpGet(“/a/b/c”);
// 連接服務器並獲取應答數據:
HttpResponse response = httpClient.execute(targetHost, httpGet);
// 讀取應答數據:
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getHeaders();
HttpEntity entity = response.getEntity();
// …
} catch (Exception ee) {
// …
}
3. 使用 android 接口:
類android.net.http.* 實際上是通過對 Apache 的 HttpClient 的封裝來實現的一個 HTTP 編程接口,同時還提供了 HTTP 請求隊列管理、以及 HTTP 連接池管理,以提高並發請求情況下(如轉載網頁時)的處理效率,除此之外還有網絡狀態監視等接口。
例:(class AndroidHttpClient : Since Android API level
try {
AndroidHttpClient client =
AndroidHttpClient.newInstance(“user_agent__my_mobile_browser”);
// 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向:
HttpGet httpGet = new HttpGet (“http://www.test_test.com/”);
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 錯誤處理…
}
//…
// 關閉連接:
client.close();
} catch (Exception ee) {
//…
}