热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样

    网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架。

   思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,COOKIE处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以。

   二次助封装代码例如以下:

   1.功能接口:

/**********************************************************
 * @文件名:DisposeDataListener.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:01:13
 * @文件描写叙述:
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public interface DisposeDataListener
{
    /**
     * 请求開始回调事件处理
     */
    public void onStart();

    /**
     * 请求成功回调事件处理
     */
    public void onSuccess(Object responseObj);

    /**
     * 请求失败回调事件处理
     */
    public void onFailure(Object reasonObj);

    /**
     * 请求重连回调事件处理
     */
    public void onRetry(int retryNo);

    /**
     * 请求进度回调事件处理
     */
    public void onProgress(long bytesWritten, long totalSize);

    /**
     * 请求结束回调事件处理
     */
    public void onFinish();

    /**
     * 请求取消回调事件处理
     */
    public void onCancel();
}


   2.请求功能接口适配器模式

public class DisposeDataHandle implements DisposeDataListener
{
    @Override
    public void onStart()
    {
    }

    @Override
    public void onSuccess(Object responseObj)
    {
    }

    @Override
    public void onFailure(Object reasonObj)
    {
    }

    @Override
    public void onRetry(int retryNo)
    {
    }

    @Override
    public void onProgress(long bytesWritten, long totalSize)
    {
    }

    @Override
    public void onFinish()
    {
    }

    @Override
    public void onCancel()
    {
    }
}

   3.请求回调事件处理:   

/**********************************************************
 * @文件名:BaseJsonResponseHandler.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午10:41:46
 * @文件描写叙述:服务器Response基础类,包含了java层异常和业务逻辑层异常码定义
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class BaseJsonResponseHandler extends JsonHttpResponseHandler
{
    /**
     * the logic layer exception, may alter in different app
     */
    protected final String RESULT_CODE = "ecode";
    protected final int RESULT_CODE_VALUE = 0;
    protected final String ERROR_MSG = "emsg";
    protected final String EMPTY_MSG = "";

    /**
     * the java layer exception
     */
    protected final int NETWORK_ERROR = -1; // the network relative error
    protected final int JSON_ERROR = -2; // the JSON relative error
    protected final int OTHER_ERROR = -3; // the unknow error

    /**
     * interface and the handle class
     */
    protected Class mClass;
    protected DisposeDataHandle mDataHandle;

    public BaseJsonResponseHandler(DisposeDataHandle dataHandle, Class clazz)
    {
        this.mDataHandle = dataHandle;
        this.mClass = clazz;
    }

    public BaseJsonResponseHandler(DisposeDataHandle dataHandle)
    {
        this.mDataHandle = dataHandle;
    }

    /**
     * only handle the success branch(ecode == 0)
     */
    public void onSuccess(JSONObject response)
    {
    }

    /**
     * handle the java exception and logic exception branch(ecode != 0)
     */
    public void onFailure(Throwable throwObj)
    {
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response)
    {
        onSuccess(response);
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
    {
        onFailure(throwable);
    }
}

/**********************************************************
 * @文件名:CommonJsonResponseHandler.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:01:13
 * @文件描写叙述:业务逻辑层真正处理的地方,包含java层异常和业务层异常
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class CommonJsonResponseHandler extends BaseJsonResponseHandler
{
    public CommonJsonResponseHandler(DisposeDataHandle dataHandle)
    {
        super(dataHandle);
    }

    public CommonJsonResponseHandler(DisposeDataHandle dataHandle, Class

> clazz)     {         super(dataHandle, clazz);     }     @Override     public void onStart()     {         mDataHandle.onStart();     }     @Override     public void onProgress(long bytesWritten, long totalSize)     {         mDataHandle.onProgress(bytesWritten, totalSize);     }     @Override     public void onSuccess(JSONObject response)     {         handleResponse(response);     }     @Override     public void onFailure(Throwable throwObj)     {         mDataHandle.onFailure(new LogicException(NETWORK_ERROR, throwObj.getMessage()));     }     @Override     public void onCancel()     {         mDataHandle.onCancel();     }     @Override     public void onRetry(int retryNo)     {         mDataHandle.onRetry(retryNo);     }     @Override     public void onFinish()     {         mDataHandle.onFinish();     }     /**      * handle the server response      */     private void handleResponse(JSONObject response)     {         if (respOnse== null)         {             mDataHandle.onFailure(new LogicException(NETWORK_ERROR, EMPTY_MSG));             return;         }         try         {             if (response.has(RESULT_CODE))             {                 if (response.optInt(RESULT_CODE) == RESULT_CODE_VALUE)                 {                     if (mClass == null)                     {                         mDataHandle.onSuccess(response);                     }                     else                     {                         Object obj = ResponseEntityToModule.parseJsonObjectToModule(response, mClass);                         if (obj != null)                         {                             mDataHandle.onSuccess(obj);                         }                         else                         {                             mDataHandle.onFailure(new LogicException(JSON_ERROR, EMPTY_MSG));                         }                     }                 }                 else                 {                     if (response.has(ERROR_MSG))                     {                         mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), response                                 .optString(ERROR_MSG)));                     }                     else                     {                         mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), EMPTY_MSG));                     }                 }             }             else             {                 if (response.has(ERROR_MSG))                 {                     mDataHandle.onFailure(new LogicException(OTHER_ERROR, response.optString(ERROR_MSG)));                 }             }         }         catch (Exception e)         {             mDataHandle.onFailure(new LogicException(OTHER_ERROR, e.getMessage()));             e.printStackTrace();         }     } }

  4.自己定义异常类,对java异常和业务逻辑异常封装统一处理

/**********************************************************
 * @文件名:LogicException.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午10:05:08
 * @文件描写叙述:自己定义异常类,返回ecode,emsg到业务层
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class LogicException extends Exception
{
	private static final long serialVersiOnUID= 1L;

	/**
	 * the server return code
	 */
	private int ecode;

	/**
	 * the server return error message
	 */
	private String emsg;

	public LogicException(int ecode, String emsg)
	{
		this.ecode = ecode;
		this.emsg = emsg;
	}

	public int getEcode()
	{
		return ecode;
	}

	public String getEmsg()
	{
		return emsg;
	}
}
   5.请求发送入口类CommonClient:
/**********************************************************
 * @文件名:CommonClient.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:38:57
 * @文件描写叙述:通用httpclient,支持重连,取消请求,COOKIE存储
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class CommonClient
{
	private static AsyncHttpClient client;
	static
	{
		/**
		 * init the retry exception
		 */
		AsyncHttpClient.allowRetryExceptionClass(IOException.class);
		AsyncHttpClient.allowRetryExceptionClass(SocketTimeoutException.class);
		AsyncHttpClient.allowRetryExceptionClass(ConnectTimeoutException.class);
		/**
		 * init the block retry exception
		 */
		AsyncHttpClient.blockRetryExceptionClass(UnknownHostException.class);
		AsyncHttpClient.blockRetryExceptionClass(ConnectionPoolTimeoutException.class);

		client = new AsyncHttpClient();
	}

	public static RequestHandle get(String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(url, responseHandler);
	}

	public static RequestHandle get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(url, params, responseHandler);
	}

	public static RequestHandle get(Context context, String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, responseHandler);
	}

	public static RequestHandle get(Context context, String url, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, params, responseHandler);
	}

	public static RequestHandle get(Context context, String url, Header[] headers, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, headers, params, responseHandler);
	}

	public static RequestHandle post(String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(url, responseHandler);
	}

	public static RequestHandle post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(url, params, responseHandler);
	}

	public static RequestHandle post(Context context, String url, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, params, responseHandler);
	}

	public static RequestHandle post(Context context, String url, HttpEntity entity, String contentType,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, entity, contentType, responseHandler);
	}

	public static RequestHandle post(Context context, String url, Header[] headers, RequestParams params,
			String contentType, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, headers, params, contentType, responseHandler);
	}

	public static RequestHandle post(Context context, String url, Header[] headers, HttpEntity entity,
			String contentType, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, headers, entity, contentType, responseHandler);
	}

	/**
	 * calcel the context relative request
	 * @param context
	 * @param mayInterruptIfRunning
	 */
	public void calcelRequests(Context context, boolean mayInterruptIfRunning)
	{
		client.cancelRequests(context, mayInterruptIfRunning);
	}

	/**
	 * cancel current all request in app
	 * @param mayInterruptIfRunning
	 */
	public void cacelAllrequests(boolean mayInterruptIfRunning)
	{
		client.cancelAllRequests(mayInterruptIfRunning);
	}

	public static void setHttpContextAttribute(String id, Object obj)
	{
		client.getHttpContext().setAttribute(id, obj);
	}

	public static Object getHttpContextAttribute(String id)
	{
		return client.getHttpContext().getAttribute(id);
	}

	public static void removeHttpContextAttribute(String id)
	{
		client.getHttpContext().removeAttribute(id);
	}

	/**
	 * set the COOKIE store
	 * @param COOKIEStore
	 */
	public static void setCOOKIEStore(COOKIEStore COOKIEStore)
	{
		client.setCOOKIEStore(COOKIEStore);
	}

	/**
	 * remove the COOKIE store
	 */
	public static void removeCOOKIEStore()
	{
		removeHttpContextAttribute(ClientContext.COOKIE_STORE);
	}
}

     6.登陆DEMO使用

     COOKIE的保存,   

public class MyApplicaton extends Application {
	private static MyApplicaton app;

	@Override
	public void onCreate() {
		super.onCreate();
		app = this;
		/**
		 * 为全局 CommonClient加入COOKIEStore,从PersistentCOOKIEStore中能够拿出全部COOKIE
		 */
		CommonClient.setCOOKIEStore(new PersistentCOOKIEStore(this));
	}

	public static MyApplicaton getInstance() {
		return app;
	}
}

     响应体的处理:

   private void requestLogin()
	{
		RequestParams params = new RequestParams();
		params.put("mb", "");
		params.put("pwd", "");
		CommonClient.post(this, URL, params, new CommonJsonResponseHandler(
				new DisposeDataHandle()
				{
					@Override
					public void onSuccess(Object responseObj)
					{
						Log.e("------------->", responseObj.toString());
						
					}

					@Override
					public void onFailure(Object reasonObj)
					{
						Log.e("----->", ((LogicException)reasonObj).getEmsg());
					}

					@Override
					public void onProgress(long bytesWritten, long totalSize)
					{
						Log.e("------------->", bytesWritten + "/" + totalSize);
					}
				}));
	}

    经过以上封装后。基于的http功能都具备了,假设开发中遇到一些特殊的功能,可能再依据详细的需求扩展。


    源代码下载


推荐阅读
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本篇文章给大家分享的是有关如何正确的使用HttpClient方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不 ... [详细]
  • 最近手上在进行一个性能测试项目,脚本是java语言使用httpClient实现http请求。并发用户数线程只有40个,但是服务器端启动的线程出现了400多个,是哪里平白无故出现这么多线程呢?肯定是有问 ... [详细]
  • 在Java领域,谈到网络编程,可能大家脑海里第一反应就是MINA,NETTY,GRIZZLY等优秀的开源框架。没错,不过在深入探究这些框架之前,我们需要先从最original的技 ... [详细]
  • 本文探讨了JavaScript的基本概念,包括其作为解释型、脚本语言的特点,以及它支持的面向对象编程(OOP)原则。重点介绍了封装、继承和多态等OOP特性,并详细解释了如何在JavaScript中创建和使用对象。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • HttpClient作为官方推荐的http客户端,相比之前的WebClient和WebRequest好用了很多,但默认无法为每个请求单独设置超时,只能给HttpClient设置默认 ... [详细]
author-avatar
jia19891213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有