2015年7月24日星期五

使用HTTP协议访问网络之HttpClient

HttpClient是Apache提供的HTTP网络访问接口,其可以完成与HttpURLConnection几乎(?)一模一样的效果。这次写一下HttpClient。

HttpClient是一个接口,因此无法创建它的实例,通常情况下会创建一个DefaultHttpClient的实例,如下:

HttpClient httpClient = new DefaultHttpClient();

接下来发起GET或POST请求,如下。

1.要发起GET请求,创建一个HttpGET对象,并传入目标的网络地址,然后调用HttpClient的execute()方法,

   HttpGet httpGet = new HttpGet("http://www.baidu.com");
   httpClient.execute(httpGet);

2.若要发起一条POST请求,需创建一个HttpPost对象,并传入目标的网络地址,

  HttpPost httpPost = new HttpPost("http://www.baidu.com");
  
   然后通过一个NameValuePair集合来存放待提交的参数,并将这个参数合并传入到一个          UrlEncodedFormEnity中,然后调用HttpPost的setEnity()方法将构建好的    UrlEncodedFormEnity传入,如下:

  List<NameValuePair> params = new ArrayList<NameValuePair>();
  params.add(new BasicNameValuePair("username", "admin"));
  params.add(new BasicNameValuePair("password", "123456"));
  UrlEncodedFormEnity entity = new UrlEncodedFormEnity(params, "utf-8");
  httpPost.setEnity(enity);
  httpClient.execute(httpPost);


执行execute()方法之后会返回一个HttpRespomse对象,服务器所返回的所有信息就会包含在这里面。通常情况下我们会先去除服务器返回的状态码,如果等于200就说明请求和相应都成功了,如下所示,

if (httpResponse.getStatusLine().getStatusCode() == 200) {
               //请求和响应成功啦
}

接下来再这个If判断的内部去除服务返回的具体内容,可以调用getEntity()方法获取到一个HttpEnity实例,然后再用EnityUtils.toString()这个静态方法将HttpEnity转换成字符串,

HttpEnity enity = httpResponse.getEnity();
String response = EnityUtils.toString(enity, "utf-8");//防止中文乱码


最后,来一个完整的例子,

private void senRequestWithHttpClient() {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet ("http://www.baidu.com");
HttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200) {
//请求和相应都成功了
HttpEnity enity = httpResponse.getEntity();
String response = EnityUtils.toString(entity, "utf-8");
Message message = new Message();
message.what = SHOW_RESPONSE;
//将服务器返回的结果存放在Message中
message.obj = response.toString();
handler.sendMessage(message);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}


LOL!

没有评论:

发表评论