Android之HttpClient和HttpUrlConnection

Android中提供了两种网络请求方式,一种是使用Apache的HttpClient,或者使用使用Java的HttpUrlConnection。本文主要介绍Httpclient.

使用HttpClient的一般步骤

  • 使用DefaultHttpCLient类实例化一个HttpClient的实例。
  • 创建HttpGet或者HttpPost对象,并将要访问的Url传入进去
  • 使用httpclient对象执行HttpGet(HttpPost)对象,并得到相应的HttpResponse对象
  • 通过HttpResponse接口getEntity方法,获得响应信息,再做进一步处理。

    public void sendGetRequest(String url){
    HttpClient httpClient = new DefaultHttpClient(defaultParams());
    //创建HttpGet对象
    HttpGet httpget = new HttpGet(url);
    //添加头部
    httpget.addHeader(“connection”,”Keep-Alive”);
    //执行请求操作
    HttpResponse response = httpClient.excute(httpget);
    HttpEntity entity = response.getEntiry();
    if(entiry!=null){
    InputStream is = entity.getContent();
    //解析结果
    String result = convertStream2String(is);
    is.close();
    }
    }

    public static HttpParams defaultParams(){
    HttpParams mDefaultParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeOut(mDefaultParams,10000);
    HttpConnectionParams.setSoTimeOut(mDefaultParams,15000);
    HttpConnectionParam.setNoDelay(mDefaultParams,true);

    //关闭就连接检查的配置为false
    HttpConntionParams.setStaleCheckingEnable(mDfaultParams,false);
    //协议参数
    HttpProtocalParams.setVersion(mDefaultsParams,HttpVersion.HTTP_1_1);
    //持续握手
    HttpProtocolParams.setUseExpectionContinue(mdefaultParams,false);
    return mDefaultParams;
    

    }

注意:使用HttpGet调用时,url的参数暴露在URL中。并且长度限制在2048个字符之内(HTTP1.1之后URL的长度才没有限制)。

HttpUrlConnection

引入HttpUrlConnetion的原因

HttpClient已经能够满足我们的需求,那么为什么还要用HttpUrlconnection呢? 这是因为在ANdorid2.2呢?这是因为在Android2.2版本之前,JttpClient用为较少的Bug,而HttpUrlConneciton一直存在令人讨厌的bug。例如:一个可读的InputStream调用close()方法时,就有可能导致连接池失效。因此在android2.2之前使用HttpClient是比较好的。而在Android2.2之后,使用HttpUrlConnection是比较明智的。它提供的压缩、缓存机制可以有效的减少网络访问。

public void sendRequest(String url) throws IOException{
    InputStream is = null;
    try{
        URL newUrl = new URL(url);
        HttpUrlConnection conn = (HttpUrlConnection)newUrl.openConnection();
        //设置读取的超时时间
        conn.setReadTimeOut(1000);
        //设置连接的超时时间
        conn.setConnectionTimeOut(1500);
        //设置可读数据
        conn.setDoInput(true);
        //设置可传数据
        conn.setDoOutPut(true);
        //设置保持长连接
        conn.setRequestProperties("connection","keep-Alive");
        //设置请求方式
        conn.setRequestMethod("POST");
        //添加请求参数
        List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
        /传入相应的键值对
        paramsList.add(new BasicNameValuePair("username","mr.simple"));
        paramsList.add(new BasicNameValuePair("pwd","mypwd"));
        //将参数和连接进行关联
        writeParams(conn.getOutStream(),paramsList);

        //发起请求
        conn.connect();
        is = conn.getInputStream();

        //获取请求结果
        String result = converStream2String(is);
        Log.e("","### 请求结果:" + result);
    }finally{
        if(is!=null){
            is.close();
        }
    }
}


public void writeParams(OutPutStream out , List<NameValuePaire> paramsList){
    StringBuilder sb  = new  StringBuilder();
    for(NameValuePair pair: paramsList){
        if(!TextUtils.isEmpty(sb)){
            sb.append("&");
        }

        sb.append(URLEncoder.encode(pair.getName(),"utf-8"));
        sb.append("=");
        sb.append(URLEncoder.encode(pair.getValue(),"utf-8");
    }
    BufferedWriter bw = new BufferWriter(new OutpuStreamWriter(out,"utf-8"));
    bw.write(sb.toString());
    bw.flush();
    bw.close();
}

注意:
* 使用HttpUrlConnection时需要注意,如果我们要添加参数,那么需要调用HttpUrlConeneciton对象的setDoOutput(true)方法来启动输出功能。不同的请求方式是通过HttpUrlConnection的setRequestMethod()来进行设置。
* 如果是get请求,一定不要在请求体中传入参数,否则会变为post请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值