Android之HttpClient和HttpUrlConnection

来源:互联网 发布:360游戏优化器安卓版 编辑:程序博客网 时间:2024/04/29 10:24

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);

    //关闭就连接检查的配置为falseHttpConntionParams.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
原创粉丝点击