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) {                //请求失败            }        });    }}

总结

  1. 上面代码中的JSON为fastjson项目中的JSON转换类, HttpUtils为假设自定义的Http请求工具类。
  2. 此接口的难点在于巧妙的使用了反射的API获取泛型的参数化类型,而不需要传具体需要转换的Class类型。
  3. 大部分客户端(Client)调用服务端(Server)时响应数据都遵循了某些规则(JSON,xml或其它格式),部分公开WebAPI的响应数据格式:{code:code, text:text,…},通过code进行请求标识,text则为实际响应的业务数据。此接口设计也推荐此种数据格式,客户端可以明确知道服务端响应的结果,不需要做更多的工作。
1 0
原创粉丝点击