请求类型绑定响应类型
常规请求,响应,客户端的写法
请求
public abstract class BaseRequest {
protected String systemCode;
protected String timestamp;
protected String sign;
}
public class GoodsDetailRequest extends BaseRequest {
private String goodsId;
}
响应
public abstract class BaseResponse {
protected String code;
protected String message;
}
public class GoodsDetailResponse extends BaseResponse {
private String id;
private String goodsType;
private String goodsPrice;
private String goodsStatus;
private String goodsImage;
}
Client
public class JdClient {
private String postRequest(String param) {
return HttpUtil.createPost("https://url.com/api").body(param).execute().body();
}
public GoodsDetailResponse getGoodsDetail(GoodsDetailRequest request) {
String result = postRequest(JSONUtil.toJsonStr(request));
return JSONUtil.toJsonStr(result, GoodsDetailRequest.class);
}
public GoodsListResponse getGoodsList(GoodsListRequest request) {
String result = postRequest(JSONUtil.toJsonStr(request));
return JSONUtil.toJsonStr(result, GoodsListRequest.class);
}
// 有多少种请求响应就要写多少种方法
}
思考
这是最常见,最常规的方法,但是这不符合开闭原则。每次引入一种新的API在client中新增一个方法用于获取响应。有没有一种方法可以用于所有类型的请求响应呢?
请求类型绑定响应类型
新的请求写法
// 要求每一个请求类型绑定一个响应类型
public abstract class BaseRequest<T extends BaseResponse> {
protected String systemCode;
protected String timestamp;
protected String sign;
public abstract Class<T> getResponseType();
}
public class GoodsDetailRequest extends BaseRequest<GoodsDetailResponse> {
private String goodsId;
@Override
public Class<GoodsDetailResponse> getResponseType() {
return GoodsDetailResponse.class;
}
}
新的Client写法
public class JdClient {
private String postRequest(String param) {
return HttpUtil.createPost("https://api.com/api").body(param).execute().body();
}
// 只需要一个方法,就可以用于所有类型的API
public <T extends BaseResponse> T execute(BaseRequest<T> request) {
String result = postRequest(JSONUtil.toJsonStr(request));
return JSONUtil.toBean(result, request.getResponseType());
}
}

浙公网安备 33010602011771号