Android Http请求网络HttpClient和HttpUrlConnection

在Android API Level 9(Android 2.2)之前只能使用DefaultHttpClient类发送http请求。DefaultHttpClient是Apache用于发送http请求的客户端,其提供了强大的API支持,而且基本没有什么bug,但是由于其太过复杂,Android团队在保持向后兼容的情况下,很难对DefaultHttpClient进行增强。为此,Android团队从Android API Level 9开始自己实现了一个发送http请求的客户端类——–HttpURLConnection。

相比于DefaultHttpClient,HttpURLConnection比较轻量级,虽然功能没有DefaultHttpClient那么强大,但是能够满足大部分的需求,所以Android推荐使用HttpURLConnection代替DefaultHttpClient,并不强制使用HttpURLConnection。

但从Android API Level 23(Android 6.0)开始,不能再在Android中使用DefaultHttpClient,强制使用HttpURLConnection

由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不

二者区别

      1.    功能上,HttpClient库要丰富很多,提供了很多工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。

      2.   HttpClient高级功能代码写起来比较复杂,对开发人员的要求会高一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。

      3.   HttpURLConnection在2.3版本增加了一些HTTPS方面的改进,4.0版本增加一些响应的缓存。

      4.   HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但要自己写代码处理。

      5.   HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

      6.   HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本以上),加快了重复请求的速度。

      7.   HttpClient 适用于 web browsers, 他们是可扩展的,并且拥有大量的稳定APIs。但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。

     8.    HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。这个类起步比较晚,很容易在主要API上做稳步的改善。但是HttpURLConnection在在Android 2.2及以下版本上存在一些令人厌烦的bug,尤其是在读取 InputStream时调用 close()方法,就有可能会导致连接池失效了。

     9.    Android团队未来的工作会将更多的时间放在优化HttpURLConnection上,它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。

     10.如果一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。这种情况建议使用HttpClient。

   11.Android2.3及以上版本建议选用HttpURLConnection,2.2及以下版本建议选用HttpClient。新的应用都建议使用HttpURLConnection。
 

1、HttpClient的请求方式

这种请求方式在Android6.0版本直接删除了,这种方式在Android2.2版本之前使用比较合适,2.3版本之后比较适合HttpUrlConnection。如果在Android6.0使用的话需要依赖库

android{
		useLibrary 'org.apache.http.legacy'
		}


     //方法:发送网络请求,获取百度首页的数据。在里面开启线程
    private void sendRequestWithHttpClient() {
         new Thread(new Runnable() {
             
            @Override
             public void run() {
               //用HttpClient发送请求,分为五步
               HttpClient httpCient = new DefaultHttpClient();
                //第二步:创建代表请求的对象,参数是访问的服务器地址
                 HttpGet httpGet = new HttpGet("http://www.baidu.com");
               
                try {
                     //第三步:执行请求,获取服务器发还的相应对象
                    HttpResponse httpResponse = httpCient.execute(httpGet);
                     //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
                    if (httpResponse.getStatusLine().getStatusCode() == 200) {
                         //第五步:从相应对象当中取出数据,放到entity当中
                        HttpEntity entity = httpResponse.getEntity();
                        String response = EntityUtils.toString(entity,"utf-8");//将entity 
                           当中的数据转换为字符串
                         
                        //在子线程中将Message对象发出去
                        Message message = new Message();
                        message.what = SHOW_RESPONSE;
                         message.obj = response.toString();
                        handler.sendMessage(message);
                     }
                   
                 } catch (Exception e) {
                    // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 
             }
         }).start();//这个start()方法不要忘记了   

2、HttpURLConnection请求

get方式

package com.lyl.demo;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class Comparison {
     public static void main(String[] args) {  
    	String reString= urlConnectionGet("http://www.baidu.com");
    	System.out.println(reString);
     }  
       
     public static String urlConnectionGet(String path){
         try {
             URL url = new URL(path.trim());
             //打开连接
             HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
             if(200 == urlConnection.getResponseCode()){
                 //得到输入流
                 InputStream is =urlConnection.getInputStream();
                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 byte[] buffer = new byte[1024];
                 int len = 0;
                 while(-1 != (len = is.read(buffer))){
                     baos.write(buffer,0,len);
                     baos.flush();
                 }
                 return baos.toString("utf-8");
             }
         }  catch (IOException e) {
             e.printStackTrace();
         }
 
         return null;
     }
  
}

post方式

package com.lyl.demo;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
public class PostMethod {
	public static void main(String[] args) {
		httpPost();
	}
 
	public static void httpPost() {
		try {
			URL url = new URL("");
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setConnectTimeout(5 * 1000);
			connection.setReadTimeout(5 * 1000);
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setUseCaches(false);
			connection.setRequestMethod("POST");
			connection.setRequestProperty("Connection","keep-Alive");
			connection.setRequestProperty("Charset", "utf-8");
		    connection.setRequestProperty("Content-type","application/x-www-");
			String params = "page = 1 & num = 10";
			OutputStream os = connection.getOutputStream();
			os.write(params.getBytes());
			os.flush();
			os.close();
			if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
				InputStream is = connection.getInputStream();
				StringBuilder sb = new StringBuilder();
				byte[] bytes = new byte[1024];
				int i = 0;
				while ((i = is.read(bytes)) != -1) {
					sb.append(new String(bytes, 0, i, "utf-8"));
				}
				is.close();
 
				System.out.println("LYL_read:" + sb);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

切记Android4.0开始,Google规定网络请求等耗时操作不能放在主线程(UI线程),防止程序无响应ANR,UI画面卡顿,影响用户体验

       new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //请求网络耗时操作
                    }
                }).start();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值