HttpClient与HttpURLConnection

本文介绍了在Android中如何使用HttpClient,特别是在Android 6.0之后的处理方法。详细展示了如何配置HttpClient的连接和请求超时,创建HttpGet请求以及处理响应。同时,提供了在Eclipse和Android Studio环境下引入HttpClient库的不同方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HttpClient

Android SDK中包含了HttpClient,在Android6.0版本直接删除了HttpClient类库,如果仍想使用则解决方法是:

  • 如果使用的是eclipse则在libs中加入org.apache.http.legacy.jar
    这个jar包在:**sdk\platforms\android-23\optional目录中(需要下载android
    6.0的SDK)
  • 如果使用的是android studio则 在相应的module下的build.gradle中加入:
android{

	useLibrary 'org.apache.http.legacy'

}


HttpClient的GET请求

首先我们来用DefaultHttpClient类来实例化一个HttpClient,并配置好默认的请求参数:

//创建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;

}


接下来创建HttpGet和HttpClient,请求网络并得到HttpResponse,并对HttpResponse进行处理:

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

}

}


converStreamToString方法将请求结果转换成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;
}
 
最后我们开启线程访问百度:
new Thread(new Runnable() {
	@Override
	public void run() {
      		useHttpClientGet("http://www.baidu.com");
      	}
}).start();
请求的返回结果,请求状态码为200,结果就是个html页,这里只截取了部分html代码:

GET请求的参数暴露在URL中,这有些不大妥当,而且URL的长度也有限制:长度在2048字符之内,在HTTP 1.1后URL长度才没有限制。一般情况下POST可以替代GET,接下来我们来看看HttpClient的POST请求。
HttpClient的POST请求

post请求和get类似就是需要配置要传递的参数:

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();
   }
}
因为我们要发送POST请求,所以在UrlConnManager类中再写一个postParams()方法用来组织一下请求参数并将请求参数写入到输出流中:

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();
}
接下来我们添加请求参数,调用postParams()方法将请求的参数组织好传给HttpURLConnection的输出流,请求连接并处理返回的结果:
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();
   }
}
 
 
最后开启线程请求网络:

private void useHttpUrlConnectionGetThread() {
      new Thread(new Runnable() {
	@Override
	public void run() {
      		useHttpUrlConnectionPost("http://www.baidu.com");
      	}
      }).start();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值