HTTP Request Callback接口设计

    xiaoxiao2023-03-25  3

    背景

    在开发项目时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则为实际响应的业务数据。此接口设计也推荐此种数据格式,客户端可以明确知道服务端响应的结果,不需要做更多的工作。
    转载请注明原文地址: https://ju.6miu.com/read-1203987.html
    最新回复(0)