HTTP Request Callback接口设计

背景

在开发项目时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 [email protected] 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  业务需要的数据类型
 */
public interface Callback {

    /**
     * 成功后进行回调
     * @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  {@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 [email protected] on 2016/9/28.
 */
public class Demo {

    public static void main(String[] args){

        HttpUtils.request("http://127.0.0.1/user/", new RequestCallback(){


            @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则为实际响应的业务数据。此接口设计也推荐此种数据格式,客户端可以明确知道服务端响应的结果,不需要做更多的工作。

你可能感兴趣的:(Architecture,Design,Java,callback,设计,框架,网络)