/sdk-template

SDK-Template是一款基于面向对象的HTTP客户端。

Primary LanguageJavaApache License 2.0Apache-2.0

SDK-Template

在日常开发中,我们经常需要请求第三方提供商的接口来获取/计算数据。而当下市面上开源的HTTP客户端都是以面向过程的模式使用的,但这并不能充分发挥Java面向对象的特性,所以在这里笔者封装了一款面向对象的HTTP客户端,SDK-Template

概述

SDK-Template是一款基于面向对象的HTTP客户端。与传统的HTTP客户端不同,SDK-Template的使用只需要创建HTTP 请求相对应的请求体和响应体即可,而不需要再创建各自的请求方法,这不论在易用性上还是在可读性上都具有明显的优势。

用法

SDK-Template的使用上,我们只需要将请求体和响应体声明为相应的对象,然后将其交给HttpClient进行执行即可。下面笔者将按照这3部分详细展开。

构造HTTP请求

对于HTTP请求体的构建,我们只需要继承SdkRequest类,然后实现其中的getAction()方法、getMethod()方法和getResponseClass()方法即可,其中它们的作用如下所示:

方法 描述
getAction 表示请求路径。
getMethod 表示请求方法。
getResponseClass 表示响应类型。

当然,如果需要在请求中添加对应的请求字段,则需要同时在SdkRequest的实现类中声明对应的变量,并且通过注解声明。例如:

@Data
@RequiredAppId(type = QUERY_PARAMS)
@RequiredAppSecret(type = QUERY_PARAMS)
@ContentType(value = HttpConstant.ContentType.APPLICATION_JSON)
public class SdkAuthorizeRequest implements SdkRequest<SdkAuthorizeResponse> {

    @Params(name = "code", type = QUERY_PARAMS)
    private String code;

    public SdkAuthorizeRequest() {
    }

    public SdkAuthorizeRequest(String code) {
        this.code = code;
    }

    @Override
    public String getAction() {
        return "v1/authorize";
    }

    @Override
    public HttpMethod getMethod() {
        return HttpMethod.GET;
    }

    @Override
    public Class<SdkAuthorizeResponse> getResponseClass() {
        return SdkAuthorizeResponse.class;
    }
}

SdkRequest的实现类中,我们可以使用以下几个注解:

注解 描述
@ContentType 表示请求Header中的Content-Type
@RequiredAppId 表示请求中需要添加appId字段。
@RequiredAppSecret 表示请求中需要添加appSecret字段。
@Params 表示请求中需要添加的其他字段。

其中,在@RequiredAppId@RequiredAppSecret@Params中需要指定请求字段的类型,可选值为:

字段类型 描述
HEADER_PARAMS 表示HEADER类型参数。
QUERY_PARAMS 表示QUERY类型参数。
BODY_PARAMS 表示BODY类型参数。

这样,我们就完成了HTTP请求体的构建了。

构造HTTP响应

而对于HTTP响应体,我们则需要继承SdkResponse类,并且对应的具体响应类型需要在SdkRequest实现类中的getResponseClass方法进行指定。例如:

@Data
public class SdkAuthorizeResponse implements SdkResponse {

    /**
     * 响应code
     */
    private Integer code;

    /**
     * 响应message
     */
    private String msg;

    /**
     * 响应数据
     */
    private String data;

}

这样,我们就完成了HTTP响应体的构建了。

执行HTTP请求

在构建完请求体和响应体后,我们就可以使用HttpClientexecute方法执行了。

HttpClient httpClient=new HttpClient(endpoint,appId,appSecret);
SdkAuthorizeResponse response=httpClient.execute(new SdkAuthorizeRequest(code));

这样,我们就以面向对象的方式执行了一次HTTP请求了。

更多使用细节可阅读相应的单元测试用例。

扩展

关于SDK-Template的单元测试,这里是通过 WireMock 实现模拟接收请求和响应请求的。对于Java代码中使用WireMock ,首先我们需要创建并启动服务器WireMockServer,然后再通过客户端WireMockWireMockServer服务器注册mock映射即可。当然,我们也可以在创建WireMockServer服务器时,将相关的mock映射提前添加到它的配置中。

WireMock的使用上,我们也可以单独将其部署为一个服务(可通过启动参数配置实例属性),然后通过Java客户端WireMock、配置文件File或者HTTP请求注册相应的mock映射。

最后,如果读者对WireMock十分感兴趣,可以阅读其官方文档和GITHUB源码了解更多细节:

另外,对于与其具有相同作用的MockServer也可以了解一下: