1. 概要
本文主要介紹在Android平臺上開發網絡應用的一些常用接口。
2. Android平臺上可以使用的幾種網絡接口
Android平臺的網絡應用絕大部分都是基於Java的編程接口的,也就是說我們開發類似的運用的時候可以有多種選擇,比J2me確實好多了。
2.1. 標準Java接口
java.net.*下面提供了訪問 HTTP 服務的基本功能。使用這部分接口的基本操作主要包括:
· 創建 URL 以及 URLConnection / HttpURLConnection 對象
· 設置連接參數
· 連接到服務器
· 向服務器寫數據
· 從服務器讀取數據
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
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();
// 往服務器寫數據,數據會暫時被放到內存緩存區中
// 如果僅是一個簡單的 HTTP GET,這一部分則可以省略
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.2. Apache接口
Apache HttpClient 是一個開源項目,彌補了 java.net.* 靈活性不足的缺點,爲客戶端的HTTP編程提供高效、最新、功能豐富的工具包支持。Android 平臺引入了Apache HttpClient 的同時還提供了對它的一些封裝和擴展,例如設置缺省的HTTP超時和緩存大小等。早期的 Android 曾同時包括 Commons HttpClient(org.apache.commons.httpclient.*) 和 HttpComponents (org.apache.http.client.* ),不過當前版本 (1.5) 中開發者只能使用後者,也就是說類似以下的一些類:
使用這部分接口的基本操作與 java.net.* 基本類似,主要包括:
· 創建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等對象
· 設置連接參數
· 執行 HTTP 操作
· 處理服務器返回結果
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.params. HttpConnectionParams;
import org.apache.http.client.params. HttpClientParams;
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
HttpClient 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();
}
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.params. HttpConnectionParams;
import org.apache.http.client.params. HttpClientParams;
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
HttpClient 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().setCredentials(
new AuthScope("your_auth_host", 80, "your_realm"),
new UsernamePasswordCredentials("username", "password"));
// 設置服務器地址,端口,訪問協議
HttpHost targetHost = new HttpHost("www.test_test.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) {
//
}
2.3. Android接口
android.net.* 實際上是通過對 Apache 的 HttpClient 的封裝來實現的一個 HTTP 編程接口,同時還提供了 HTTP 請求隊列管理, 以及 HTTP 連接池管理,以提高併發請求情況下(如轉載網頁時)的處理效率,除此之外還有網絡狀態監視等接口。
以下是一個通過 AndroidHttpClient 訪問服務器的最簡例子:
import import android.net.http.AndroidHttpClient;
try {
AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);
// 創建 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) {
//
}
import import android.net.http.AndroidHttpClient;
try {
AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);
// 創建 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) {
//
}