网络<二>httpclient /httpURLConnection

httpclient /httpURLConnection

httpclient和httpURLConnection是android早期的网络原生请求类库,httpclient先于httpConnection.虽然现在retrofit,okhttp等网络框架很方便,但是博主认为作为一个合格的程序员应该对此有所了解
相对于httpClient,httpURLConnection的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。另外在Android 6.0版本中,HttpClient库被移除了,HttpURLConnection则是以后我们唯一的选择.
但是在2.2之前httpURLConnection有bug,可读inputStream调用close方法时候连接池会失效,所以需要加动态权限:

      // 这是一个2.2版本之前的bug
      if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
            System.setProperty("http.keepAlive", "false");
      }

1.httpClient

首先来看httpClient,由于6.0android删除了httpClient类库;在eclipse中需要加入jar<不详解,现在不使用eclipse编译>;在as的moudle中添加依赖:

android {
    useLibrary 'org.apache.http.legacy'
     }
    //下面来看get请求:
//创建HttpClient
   private HttpClient createHttpClient() {
       HttpParams mDefaultHttpParams = new BasicHttpParams();
       //设置连接超时
       HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);
       //设置请求超时
       HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000);
       HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);
       HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);
       HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);
       //持续握手
       HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);
       HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams);
       return mHttpClient;
   }
//get请求
   private void useHttpClientGet(String url) {
      HttpGet mHttpGet = new HttpGet(url);
      mHttpGet.addHeader("Connection", "Keep-Alive");
      try {
          HttpClient mHttpClient = createHttpClient();
          HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
          HttpEntity mHttpEntity = mHttpResponse.getEntity();
          int code = mHttpResponse.getStatusLine().getStatusCode();
          if (null != mHttpEntity) {
              InputStream mInputStream = mHttpEntity.getContent();
              String respose = converStreamToString(mInputStream);
              Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose);
              mInputStream.close();
          }
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
//将请求得到的I/O流转化为String
private String converStreamToString(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        String respose = sb.toString();
        return respose;
    }

//接着来看post,区别于get ,post需要添加请求数据

//创建HttpClient
   private HttpClient createHttpClient() {
       HttpParams mDefaultHttpParams = new BasicHttpParams();
       //设置连接超时
       HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);
       //设置请求超时
       HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000);
       HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);
       HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);
       HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);
       //持续握手
       HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);
       HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams);
       return mHttpClient;
   }
//post请求 
private void useHttpClientPost(String url) {
    HttpPost mHttpPost = new HttpPost(url);
    mHttpPost.addHeader("Connection", "Keep-Alive");
    try {
        HttpClient mHttpClient = createHttpClient();
        List<NameValuePair> postParams = new ArrayList<>();
        //要传递的参数
        postParams.add(new BasicNameValuePair("username", "moon"));
        postParams.add(new BasicNameValuePair("password", "123"));
        mHttpPost.setEntity(new UrlEncodedFormEntity(postParams));
        HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost);
        HttpEntity mHttpEntity = mHttpResponse.getEntity();
        int code = mHttpResponse.getStatusLine().getStatusCode();
        if (null != mHttpEntity) {
            InputStream mInputStream = mHttpEntity.getContent();
            String respose = converStreamToString(mInputStream);
            Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose);
            mInputStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//IO流转化为String
private String converStreamToString(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        String respose = sb.toString();
        return respose;
    }

2.httpURLConnection

这里仅提供post请求代码,ok~往下看:

//HttpURLConnection 单例获取
public static HttpURLConnection getHttpURLConnection(String url){
     HttpURLConnection mHttpURLConnection=null;
     try {
         URL mUrl=new URL(url);
         mHttpURLConnection=(HttpURLConnection)mUrl.openConnection();
         //设置链接超时时间
         mHttpURLConnection.setConnectTimeout(15000);
         //设置读取超时时间
         mHttpURLConnection.setReadTimeout(15000);
         //设置请求参数
         mHttpURLConnection.setRequestMethod("POST");
         //添加Header
         mHttpURLConnection.setRequestProperty("Connection","Keep-Alive");
         //接收输入流
         mHttpURLConnection.setDoInput(true);
         //传递参数时需要开启
         mHttpURLConnection.setDoOutput(true);
     } catch (IOException e) {
         e.printStackTrace();
     }
     return mHttpURLConnection ;
 }
 //post特有的请求参数
 public static void postParams(OutputStream output,List<NameValuePair>paramsList) throws IOException{
      StringBuilder mStringBuilder=new StringBuilder();
      for (NameValuePair pair:paramsList){
          if(!TextUtils.isEmpty(mStringBuilder)){
              mStringBuilder.append("&");
          }
          mStringBuilder.append(URLEncoder.encode(pair.getName(),"UTF-8"));
          mStringBuilder.append("=");
          mStringBuilder.append(URLEncoder.encode(pair.getValue(),"UTF-8"));
      }
      BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(output,"UTF-8"));
      writer.write(mStringBuilder.toString());
      writer.flush();
      writer.close();
  }
  //发送post请求
  private void useHttpUrlConnectionPost(String url) {
     InputStream mInputStream = null;
     HttpURLConnection mHttpURLConnection = UrlConnManager.getHttpURLConnection(url);
     try {
         List<NameValuePair> postParams = new ArrayList<>();
         //要传递的参数
         postParams.add(new BasicNameValuePair("username", "moon"));
         postParams.add(new BasicNameValuePair("password", "123"));
         UrlConnManager.postParams(mHttpURLConnection.getOutputStream(), postParams);
         mHttpURLConnection.connect();
         mInputStream = mHttpURLConnection.getInputStream();
         int code = mHttpURLConnection.getResponseCode();
         String respose = converStreamToString(mInputStream);
         Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose);
         mInputStream.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

这就是httpClient/httpURLConnection的GET/POST请求,有兴趣的可以继续其源码~希望可以帮到大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值