HTTP Request Callback接口设计
来源:互联网 发布:建筑结构用什么软件 编辑:程序博客网 时间:2024/05/31 06:22
背景
在开发项目时HTTP 请求使用了框架,此博文是在不使用相关框架的情况下,如何将HTTP请求的结果传达至请求的位置的接口设计,简称为 HTTP Request Callback接口设计。
为什么叫做Callback,是因为HTTP网络请求为耗时操作,我们并不知道结果何时返回,待响应后将结果告知调用者的方式。
需要解决的问题
1. 将请求失败的结果回调至请求位置
失败结果包含两部分:一是HTTP Request失败,二是业务逻辑的失败
2. 将请求成功的结果回调至请求位置
此处需要考虑就是如何将HTTP Response 的字符串转为指定任意类型
接口设计
根据上述我们需要解决的问题进行接口设计。
[转载请注明:Canney 原创:http://blog.csdn.net/canney_chen/article/details/52689269]
Response
首先将HTPP Response的结果进行回调设计出以下接口。
package me.kaini.http;/** * * Created by chen.canney@gmail.com on 2016/9/28. */public interface Response { /** * HTTP成功响应的结果 * @param text */ void onResponse(String text); /** * HTTP响应状态 * @param status */ void onStatus(int status);}
Callback
package me.kaini.http;/** * Created by chen.canney@gmail.com on 2016/9/28. * @param <T> 业务需要的数据类型 */public interface Callback<T> { /** * 成功后进行回调 * @param data 业务类型的数据 */ void onSuccess(T data); /** * 失败后进行回调 * @param code */ void onFailed(int code);}
RequestCallback
package me.kaini.http;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import com.alibaba.fastjson.JSON;/** * 响应消息处理 * 将响应结果转换成业务所需要的数据类型 * @param <T> {@link Callback} * Created by chen.canney@gmail.com on 2016/9/28. */public abstract class RequestCallback<T> implements Response, Callback<T> { private final Type type; public RequestCallback() { //解析业务的参数化类型 Type superClass = this.getClass().getGenericSuperclass(); this.type = ((ParameterizedType)superClass).getActualTypeArguments()[0]; } public Type getType() { return this.type; } @Override public void onResponse(String text) { //todo: 可以添加失败判断条件然后调用onFailed(int) //成功回调 T data = JSON.parseObject(text, getType()); onSuccess(data); } @Override public void onStatus(int status) { if(status == 200){ return; } onFailed(status); }}
使用示例
package me.kaini.http;/** * Created by chen.canney@gmail.com on 2016/9/28. */public class Demo { public static void main(String[] args){ HttpUtils.request("http://127.0.0.1/user/", new RequestCallback<User>(){ @Override public void onSuccess(User data) { //回调获取数据后的处理 } @Override public void onFailed(int code) { //请求失败 } }); }}
总结
- 上面代码中的JSON为fastjson项目中的JSON转换类, HttpUtils为假设自定义的Http请求工具类。
- 此接口的难点在于巧妙的使用了反射的API获取泛型的参数化类型,而不需要传具体需要转换的Class类型。
- 大部分客户端(Client)调用服务端(Server)时响应数据都遵循了某些规则(JSON,xml或其它格式),部分公开WebAPI的响应数据格式:{code:code, text:text,…},通过code进行请求标识,text则为实际响应的业务数据。此接口设计也推荐此种数据格式,客户端可以明确知道服务端响应的结果,不需要做更多的工作。
1 0
- HTTP Request Callback接口设计
- Python使用request调用http接口使用说明
- HTTP API 接口安全设计
- HTTP 接口设计指北
- HTTP 接口设计指北
- 2.2.2 Callback接口
- 易宝接口callback
- 接口回调Callback
- HTTP::Request
- HTTP Request
- HTTP::Request
- HTTP Request
- HTTP Request
- 探讨Handler中的Callback接口
- Callback异步回调接口
- OCR文字识别HTTP restapi接口设计
- Android IOS Http接口设计神器APIView
- 互联网开发--HTTP接口安全设计
- cocos环境搭建教程
- 安卓Fragment 碎片!!!
- 51nod1719数值计算+二分
- [解读小程序]灵犀新闻客户端
- Android:MVP模式例子
- HTTP Request Callback接口设计
- 微信开发(调用各种接口)
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- struts的文件上传之后
- JS判断访问终端是手机还是电脑
- hibernate持久层,java代码创建表
- Styles and Themes
- 132.Function Handing 函数
- 解决新恢复的数据库在凭证序时薄上反过账的按钮处理方式