请求类型绑定响应类型

常规请求,响应,客户端的写法

请求

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());
    }
}
posted @ 2025-07-26 18:56  庚申码上仙  阅读(4)  评论(0)    收藏  举报