常规请求,响应,客户端的写法
请求
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;@Overridepublic 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();}// 只需要一个方法,就可以用于所有类型的APIpublic <T extends BaseResponse> T execute(BaseRequest<T> request) {String result = postRequest(JSONUtil.toJsonStr(request));return JSONUtil.toBean(result, request.getResponseType());}
}