http网络请求

做了一些项目做一下项目总结:

讲解一项目中网络请求的一些技巧和方法,用的技术点是httpClient的,json数据传输。

首先要对httpClient做一下优化

创建HttpParams

private static HttpParams createHttpParams() {
   final HttpParams params = new BasicHttpParams();
   // 设置是否启用旧连接检查,默认是开启的。关闭这个旧连接检查可以提高一点点性能,但是增加了I/O错误的风险(当服务端关闭连接时)。
   // 开启这个选项则在每次使用老的连接之前都会检查连接是否可用,这个耗时大概在15-30ms之间
   HttpConnectionParams.setStaleCheckingEnabled(params, false);
   HttpConnectionParams.setConnectionTimeout(params, 5*1000);// 设置链接超时时间,根据自己情况自由设置
   HttpConnectionParams.setSoTimeout(params, 5*1000);// 设置socket超时时间
   HttpConnectionParams.setSocketBufferSize(params, 10*1024);// 设置缓存大小
   HttpConnectionParams.setTcpNoDelay(params, true);// 是否不使用延迟发送(true为不延迟)
   HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); // 设置协议版本
   HttpProtocolParams.setUseExpectContinue(params, true);// 设置异常处理机制
   HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);// 设置编码
   HttpClientParams.setRedirecting(params, true);// 设置是否采用重定向
   
   ConnManagerParams.setTimeout(params, TIMEOUT);// 设置超时
   ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(10));// 多线程最大连接数
   ConnManagerParams.setMaxTotalConnections(params, 10); // 多线程总连接数
   return params;
}

为了适应https做如下操作

public static DefaultHttpClient create(boolean isHttps) {
   HttpParams params = createHttpParams();
   DefaultHttpClient httpClient = null;
   if (isHttps) {
      // 支持http与https
      SchemeRegistry schemeRegistry = new SchemeRegistry();
      schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
      schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
      // ThreadSafeClientConnManager线程安全管理类
      ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
      httpClient = new DefaultHttpClient(cm, params);
      // 设置重试次数 
      httpClient.setHttpRequestRetryHandler(new HttpRetry(MAX_RETRIES));
   } else {
      httpClient = new DefaultHttpClient(params);
      // 设置重试次数
      httpClient.setHttpRequestRetryHandler(new HttpRetry(MAX_RETRIES));
   }
   return httpClient;
}
//其中
HttpRetry继承与
HttpRequestRetryHandler重写
public boolean retryRequest(IOException exception, int executionCount, HttpContext context)通过判断
exception是否是你要重试连接的异常和executionCount时候超过了重试次数来判断是否进行重试机制
///
下面以建立get请求为例
手下建立get请求
public  String get(String url) {
   HttpGet httpGet = new HttpGet(url);
   return execute(url, httpGet);
}
//执行get请求方法execute(url.HttpRequestBase)
/** 执行网络访问 */
private  String execute(String url, HttpRequestBase requestBase) {
   Header header  =new BasicHeader("Content-Type","application/x-www-form-urlencoded");//防止乱码
   requestBase.addHeader(header);
   LogUtils.i(url);
   boolean isHttps = url.startsWith("https://");//判断是否需要采用https
AbstractHttpClient httpClient = HttpClientFactory.create(isHttps);//根据的HttpClientFactory来生成是否支持https的client
   HttpContext httpContext = new SyncBasicHttpContext(new BasicHttpContext());
   /*

  * 在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是HttpContext对 * 象。HttpContext封装了ASP.NET要处理的单次请求的所有信息。在请求处理机制建立时,HttpContext类有HttpRuntime对象实例化,接 * 着 该对象会经历请求生存期的各个阶段

* //为了方便在HttpRequestRetryHandler中的retryRequest方法中使用HttpContext来获得请求结果

    */ 
   httpContext.setAttribute(ExecutionContext.HTTP_REQUEST, requestBase);
   HttpRequestRetryHandler retryHandler = httpClient.getHttpRequestRetryHandler();//获取重试机制
   int retryCount = 0;
   boolean retry = true;
   while (retry) {
      try {
         HttpResponse response = httpClient.execute(requestBase, httpContext);//访问网络
         if (response != null) {
              if(response.getStatusLine().getStatusCode()==200){
                   return getReposeStrin(response);//方法自己写,
              }}
} catch (Exception e) { IOException ioException = new IOException(e.getMessage()); retry = retryHandler.retryRequest(ioException, ++retryCount, httpContext);//把错误异常交给重试机制,以判断是否需要采取从事 LogUtils.e(e); LogUtils.e("xx-retryCount:"+retryCount+"--retry status:"+retry); } } return null;}
//http请求工具上面已经建立好了///
下面讲一下实用,使用的时候如果我们网络请求比较频繁,那么我们需要频繁的调用http请求这样会导致高并发和流量的浪费以及代码的繁琐
所以我们可以对网络进行进一步封装。
我们可以封装一个网络请求的母体,母体的触发方法读取网络数据的时候先从本地缓存加载,设置本地查询时间是否过期,如果没加载到则从网络加载
,从网络加载的结果做缓存文件,缓存时第一行设置上过期时间留待以后检查时候,留出补全url的方法供子类实现....
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值