安卓中的HTTP編程

1、幾個概念
HTTP(HyperText Transport Protocol)超文本傳輸協議。

HTTPClient是用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且支持HTTP協議的最新的版本和建議。HTTPClient就是專門設計用來簡化HTTP客戶端與服務器間各種通信編程的。通過它可以讓原來很複雜的事情現在很輕鬆解決。

URI(uniform resource identifier)代表統一資源標識符。

URL(uniform resource locator)代表統一資源定位符。

URLConnection則代表了應用程序和URL之間的通信連接,通過URLConnection類的實例可以讀取和寫入此URL應用的資源。


2、關於HTTP
HTTP的URL格式:http://host[":"port][abs_path]

HTTP有兩類報文:請求報文和響應報文

請求報文由請求行、請求報頭、空行和請求數據4個部分組成
請求行由請求方法字段、URI字段和HTTP協議版本字段組成,它們之間用空格分隔。格式如下:
Method Request-URI HTTP-Version CRLF
例如:GET/form.html HTTP/1.1 (CRLF)

響應報文由請狀態行、響應報頭、空行和響應正文4個部分組成
狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
例如:HTTP/1.1 200 OK (CRLF)


3、通過URL對象獲得資源
public final InputStream openStream()
URL---->InputStream---->Java程序


4、HTTPClient
(1)Get在HttpClient的使用
Get方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用Get方法時,請求參數和對應的值附加在URL後面,利用一個問號("?")代表URL的結尾與請求參數的開始。
//通過Get方法獲取頁面信息
//參數爲對應頁面的URL
public static InputStream getInputStreamFromUrl(String url){
//定義輸入流變量
InputStream content=null;
try{
//取得默認的HTTPClient實例
HTTPClient httpClient=new DefaultHttpClient();
//創建HttpGet實例,連接到服務器
HttpResponse response=httpClient.execute(new HttpGet(url));
//獲取數據內容
content=response.getEntity().getContent();
}catch(Exception e){
}
//以InputStream形式返回頁面信息
return content;
}


上面的GET方法是以InputStream的形式放回頁面的信息,很多情況下需要以StringBuider、String等字符串的格式。下面的方法把InputStream格式轉爲StringBuider和String格式。
//將InputStream格式轉化爲StringBuider格式
private StringBuider inputStreamToStringBuider(InputStream is){
//定義空字符串
String line="";
//定義StringBuider的實例total
StringBuider total =new StringBuider();
//定義BufferedReader,載入InputStreamReader
BufferedReader rd=new BufferedReader(new InputStreamReader(is));
//readLine是一個阻塞的方法,當沒有斷開連接的時候就會一直等待,直到有數據返回
//返回null表示讀到數據流最末尾
while((line=rd.readLine())!=null){
total.append(line);
}
//以StringBuider形式返回數據內容
return total;
}

//將InputStream格式轉化爲String格式
private String inputStreamToString(InputStream is){
//定義空字符串
String s="";
String line="";
//定義BufferedReader,載入InputStreamReader
BufferedReader rd=new BufferedReader(new InputStreamReader(is));
//讀取到字符串中
while((line=rd.readLine())!=null){
s+=line;
}
//以String形式返回數據內容
return s;
}

(2)Post在HttpClient的使用
Post方法要求被請求服務器接收附在請求後面的數據,常用於提交表單。當客戶端給服務器提供信息較多時可以使用POST方法。POST方法將請求參數封裝在HTTP請求數據中,以名稱值的形式出現,可以傳輸大量數據。
public void postData() {
//創建一個新的HTTPClient Post頭
HttpClient httpClient=new DefaultHttpClient();
HttpPost httpPost=new HttpPost("http://www.google.com");
try {
//添加數據
List<NameValuePair> nameValuePairs=new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id","12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata","myString"));
//使用utf-8格式對數據進行編碼
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
//執行HTTPPOST請求
HttpResponse response=httpClient.execute(httpPost);
}catch(ClientProtocolException e){
}
catch (Exception e) {
}
}

(3)使用HttpClient需要以下7個步驟:
步驟1:創建HTTPClient的實例。
HttpClient httpClient=new DefaultHttpClient();
步驟2:創建某種連接方法的實例,對於get方法時GetMethod,而對於post方法是PostMethod。
HttpGet rquest = new HttpGet(String url);
HttpPost rquest = new HttpPost(String url);
步驟3:對於HttpPost對象而言,可以調用setEntity(HttpEntity entity)方法來設置請求參數。
ArrayList<NameValuePair> params=new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name",user));
params.add(new BasicNameValuePair("pwd",pwd));
request.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
步驟4:調用步驟1中創建好的實例的execute方法來執行步驟2中創建好的method實例,執行完該方法返回一個HttpResponse對象。
HttpResponse response=httpClient.execute(request);
步驟5:處理HttpResponse對象,調用HttpResponse對象的get...會得到響應的內容。
String msg=EntityUtils.toString(response.getEntity());
步驟6:釋放連接。
步驟7:對得到的內容進行處理。


5、URLConnection
(1)關鍵部分代碼
URL url=new URL("http://sc.ccit.js.cn");
URLConnection uc=url.openConnection();
HttpURLConection huc=(HttpURLConection)uc;
//連接,可有可無
huc.connect();
int response=huc.getResponseCode();
if(response==HttpURLConnection.HTTP_OK)
{
……
huc.disconnect();
}
else if(response==HttpURLConnection.HTTP_NOT_FOUND)
{
……
}
//URLConnection裏的兩個重要方法getInputStream()和getOutputStream()
InputStream inputStream=huc.getInputStream();
byte[] b=new byte[inputStream.available()];
inputStream.read(b);
String msg=new String(b);

(2)使用URLConnection有以下5個步驟:
步驟一:根據URL獲得URLConnection對象,並將其強制轉換爲其子類對象HttpURLConnection。
步驟二:由於默認請求爲GET請求,直接可以調用connect()方法。
步驟三:在請求已被成功接受的情況下,獲得該URL的InputStream輸入流。
步驟四:包裝InputStream輸入流,將其還原成原來的資源。
步驟五:斷開連接。


6、使用HttpClient和URLConnection訪問維基百科


(1)使用HttpClient訪問
//給出訪問的URL
String wikiSearchURL = "http://zh.wikipedia.org/w/api.php?action=opensearch&search=Android";
//初始化DefaultHttpClient
DefaultHttpClient httpClient=new DefaultHttpClient();
//創建HttpGet
HttpGet httpGet=new HttpGet(wikiSearchURL);
//創建ResponseHandler
ResponseHandler<String> responseHandler=new BasicResponseHandler();
try {
//獲取返回的內容
String content=httpClient.execute(httpGet, responseHandler);
//提示連接成功
Toast.makeText(getApplicationContext(), "連接維基百科成功", Toast.LENGTH_SHORT).show();
//顯示到應用界面上
showWiki.setText(content);
} catch (Exception e) {
//提示連接失敗
Toast.makeText(getApplicationContext(), "連接維基百科失敗", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
//關閉連接
httpClient.getConnectionManager().shutdown();

(2)使用URLConnection訪問
//給出訪問的URL
String wikiSearchURL = "http://zh.wikipedia.org/w/api.php?action=opensearch&search=Android";
try {
//初始化URL
URL url=new URL(wikiSearchURL);
//創建HttpURLConnection,並打開連接
HttpURLConnection httpconn=(HttpURLConnection) url.openConnection();
//連接,可有可無
httpconn.connect();
//判斷獲取的應答碼是否正常
if(httpconn.getResponseCode()==HttpURLConnection.HTTP_OK){
//給出連接成功的提示
Toast.makeText(getApplicationContext(), "連接維基百科成功", Toast.LENGTH_SHORT).show();
//創建InputStreamReader,設置字符編碼爲utf-8
InputStreamReader isr=new InputStreamReader(httpconn.getInputStream(),"utf-8");
int i;
String content="";
//讀取消息到content中
while ((i=isr.read())!=-1) {
content=content+(char)i;
}
isr.close();
//將獲取的內容顯示到界面上
showWiki.setText(content);
}
//斷開連接
httpconn.disconnect();
} catch (Exception e) {
//提示連接失敗
Toast.makeText(getApplicationContext(), "連接維基百科失敗", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章