上一篇說(shuō)了HTTP協(xié)議,這篇主要說(shuō)一下HTTP請(qǐng)求所要使用的類(lèi)扇苞,HttpClient层亿。
HttpClient簡(jiǎn)介
HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了拔莱,越來(lái)越多的 Java 應(yīng)用程序需要直接通過(guò) HTTP 協(xié)議來(lái)訪問(wèn)網(wǎng)絡(luò)資源碗降。雖然在 JDK 的 java net包中已經(jīng)提供了訪問(wèn) HTTP 協(xié)議的基本功能,但是對(duì)于大部分應(yīng)用程序來(lái)說(shuō)塘秦,JDK 庫(kù)本身提供的功能還不夠豐富和靈活讼渊。HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,用來(lái)提供高效的尊剔、最新的爪幻、功能豐富的支持 HTTP 協(xié)議的客戶(hù)端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議赋兵。
HttpClient 提供的主要的功能如下:
- 實(shí)現(xiàn)了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持自動(dòng)轉(zhuǎn)向
- 支持 HTTPS 協(xié)議
- 支持代理服務(wù)器等
HttpClient 請(qǐng)求
使用 HttpClient 需要以下 6 個(gè)步驟:
- 創(chuàng)建 HttpClient 的實(shí)例
- 創(chuàng)建某種連接方法的實(shí)例笔咽,在這里是GetMethod。在 GetMethod 的構(gòu)造函數(shù)中傳入待連接的地址
- 調(diào)用第一步中創(chuàng)建好的實(shí)例的 execute 方法來(lái)執(zhí)行第二步中創(chuàng)建好的 method 實(shí)例
- 讀 response
- 釋放連接霹期。無(wú)論執(zhí)行方法是否成功叶组,都必須釋放連接
- 對(duì)得到后的內(nèi)容進(jìn)行處理
Get請(qǐng)求
class HttpClientGetThread extends Thread{
@Override
public void run() {
HttpResponse response;
InputStream in = null;
// 默認(rèn)的HttpClient實(shí)例
HttpClient httpClient = new DefaultHttpClient();
// 創(chuàng)建HttpGet實(shí)例
HttpGet get = new HttpGet("http://www.baidu.com");
try {
//連接到服務(wù)器
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用來(lái)從輸入流中讀取數(shù)據(jù)。
private String readStreamToString(InputStream is){
if(is == null)return null;
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
String content = "";
String line = "";
try {
//從輸入流讀取數(shù)據(jù)历造,readLine方法會(huì)阻塞甩十,直到有數(shù)據(jù)返回,或者連接斷開(kāi)吭产。
while ((line = reader.readLine()) != null) {
content += line;
}
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
效果圖如下:
Post請(qǐng)求
class HttpClientPostThread extends Thread{
@Override
public void run() {
HttpResponse response;
InputStream in = null;
// 默認(rèn)的HttpClient實(shí)例
HttpClient httpClient = new DefaultHttpClient();
// 創(chuàng)建HttpPost實(shí)例
HttpPost post = new HttpPost("http://120.25.226.186:32812/login");
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
//設(shè)置參數(shù)
params.add(new BasicNameValuePair("username", "520it"));
params.add(new BasicNameValuePair("pwd", "520it"));
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
//連接到服務(wù)器
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);
}
}
打印結(jié)果如下:
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":"登錄成功"}
歡迎大家關(guān)注侣监、評(píng)論、點(diǎn)贊臣淤。
你們的支持是我堅(jiān)持的動(dòng)力橄霉。