上一篇說了HTTP協議,這篇主要說一下HTTP請求所要使用的類,HttpClient。
HttpClient簡介
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。
HttpClient 提供的主要的功能如下:
- 實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持自動轉向
- 支持 HTTPS 協議
- 支持代理服務器等
HttpClient 請求
使用 HttpClient 需要以下 6 個步驟:
1. 創建 HttpClient 的實例
2. 創建某種連接方法的實例,在這裏是GetMethod。在 GetMethod 的構造函數中傳入待連接的地址
3. 調用第一步中創建好的實例的 execute 方法來執行第二步中創建好的 method 實例
4. 讀 response
5. 釋放連接。無論執行方法是否成功,都必須釋放連接
6. 對得到後的內容進行處理
Get請求
class HttpClientGetThread extends Thread{
@Override
public void run() {
HttpResponse response;
InputStream in = null;
// 默認的HttpClient實例
HttpClient httpClient = new DefaultHttpClient();
// 創建HttpGet實例
HttpGet get = new HttpGet("http://www.baidu.com");
try {
//連接到服務器
response = httpClient.execute(get);
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity = response.getEntity();
Header contentType = entity.getContentType();
if(contentType != null)
Log.i(TAG, "name="+contentType.getName()+",value="+contentType.getValue());
long length = entity.getContentLength();
Log.i(TAG, "length="+length);
//獲取輸入流
in = entity.getContent();
}
} catch (Exception e) {
e.printStackTrace();
}
final String content = readStreamToString(in);
mTvResponse.post(new Runnable() {
@Override
public void run() {
//更新ui
mTvResponse.setText(content);
}
});
}
}
readStreamToString用來從輸入流中讀取數據。
private String readStreamToString(InputStream is){
if(is == null)return null;
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
String content = "";
String line = "";
try {
//從輸入流讀取數據,readLine方法會阻塞,直到有數據返回,或者連接斷開。
while ((line = reader.readLine()) != null) {
content += line;
}
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
效果圖如下:
Post請求
class HttpClientPostThread extends Thread{
@Override
public void run() {
HttpResponse response;
InputStream in = null;
// 默認的HttpClient實例
HttpClient httpClient = new DefaultHttpClient();
// 創建HttpPost實例
HttpPost post = new HttpPost("http://120.25.226.186:32812/login");
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
//設置參數
params.add(new BasicNameValuePair("username", "520it"));
params.add(new BasicNameValuePair("pwd", "520it"));
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
//連接到服務器
response = httpClient.execute(post);
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity = response.getEntity();
Header contentType = entity.getContentType();
if(contentType != null)
Log.i(TAG, "name="+contentType.getName()+",value="+contentType.getValue());
//獲取輸入流
in = entity.getContent();
}
} catch (Exception e) {
e.printStackTrace();
}
final String content = readStreamToString(in);
Log.i(TAG, "post content:"+content);
}
}
打印結果如下:
07-30 17:23:53.867: I/MainActivity(5329): name=Content-Type,value=application/json;charset=UTF-8
07-30 17:23:53.868: I/MainActivity(5329): post content:{"success":"登錄成功"}
歡迎大家關注、評論、點贊。
你們的支持是我堅持的動力。