学习android有一段时间了,一开始的时候,学得很杂,比较混乱,在这里,我将对几种网络请求方式做一下个人阐述。
HttpClient、HttpURLConnection阐述
一般来说,我们通常用的网络请求有HttpClient、HttpURLConnection,那首先,这二者有什么区别呢?
HttpClient:
在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。
其次:HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等。DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。HttpURLConnection:
HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。
总述:HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
具体使用
- HttpClient使用
-Get方式:
// 用Get的方式请求
HttpGet httpGet = new HttpGet(url);
// 创建一个HttpClient对象用于发送请求
HttpClient client = new DefaultHttpClient();
try {
// 调用client的execute发送一个请求,HttpResponse用于接收client执行httpGet返回的对象
HttpResponse response = client.execute(httpGet);
// 将response的结果码比较,查看是否是OK
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 通过EntityUtils获取到res0ponse响应中的内容
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
Log.i("TAG", content);
// Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
-Post方式:
// 创建HttpClient对象发送请求
HttpClient client = new DefaultHttpClient();
// 指定方式为post
HttpPost httpPost = new HttpPost(url);
// 在list中封装请求参数,通过NameValuePair存取数据
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("user_name", user_name));
list.add(new BasicNameValuePair("pass_word", pass_word));
try {
// 将list放进httpPost实体中,即设置要发送的数据
httpPost.setEntity(new UrlEncodedFormEntity(list));
// 执行请求,并返回HttpResponse对象
HttpResponse response = client.execute(httpPost);
// 判断状态码
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String content = EntityUtils.toString(response.getEntity());
System.out.println(content);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
- HttpURLConnection使用
try {
URL httpURL = new URL(url);
// 打开指定URL
HttpURLConnection conn = (HttpURLConnection) httpURL.openConnection();
// 设置网页请求超时时间
conn.setReadTimeout(5000);
// 设置数据传递方式
conn.setRequestMethod("GET");
final StringBuffer sb = new StringBuffer();
// 利用getInputStream()拿到读入流,即为指定url的内容
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String str;
// 每次读取一行
while ((str = reader.readLine()) != null) {
// 将读入流的数据放在StringBuffer中保存
sb.append(str);
}
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 通过webView加载页面信息并展示
webView.loadData(sb.toString(), "text/html;charset=utf-8", null);
}
});
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}