背景
在开发项目时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) {
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