338 字
2 分钟
使用泛型约束 SDK 的出入参

前言#

刷视频看到一种使用泛型约束,在 Request 中绑定 Response,从而简洁优雅地实现灵活扩展请求参数和返回参数,这种方式在 SDK 源码中很常见,比较简单实用,觉得有点意思,写个 demo 分享一下

Demo#

Response#

@Getter
@Setter
public abstract class BaseResponse {
private int statusCode;
}
@Getter
@Setter
public class Example1Response extends BaseResponse {
private String response1;
}
@Getter
@Setter
public class Example2Response extends BaseResponse {
private String response2;
}

Request#

定义 BaseRequest,使用泛型指定返回类型为 BaseResponse 的子类

@Getter
@Setter
public abstract class BaseRequest<T extends BaseResponse> {
private String code;
public abstract Class<T> getResponseType();
}

Request 指定返回的具体 Response 类型

@Getter
@Setter
public class Example1Request extends BaseRequest<Example1Response> {
private String example1;
@Override
public Class<Example1Response> getResponseType() {
return Example1Response.class;
}
}
@Getter
@Setter
public class Example2Request extends BaseRequest<Example2Response> {
private String example2;
@Override
public Class<Example2Response> getResponseType() {
return Example2Response.class;
}
}

Client#

public class ExampleClient {
private String postRequest(String param) {
try (HttpResponse response = HttpUtil.createPost("https://api.demo.com/api").body(param).execute()) {
if (response.isOk()) {
return response.body();
} else {
System.err.println("HTTP请求失败,状态码: " + response.getStatus());
return null;
}
} catch (Exception e) {
System.err.println("发送HTTP请求时发生异常: " + e.getMessage());
return null;
}
}
public <T extends BaseResponse> T execute(BaseRequest<T> request) {
String result = postRequest(JSONUtil.toJsonStr(request));
// 根据 request 绑定的响应类型转换 result
return JSONUtil.toBean(result, request.getResponseType());
}
}

Example#

在使用 execute 方法的时候,根据请求参数的不同,自动返回对应的响应类型

public static void main(String[] args) {
ExampleClient exampleClient = new ExampleClient();
Example1Request example1Request = new Example1Request();
Example1Response execute1 = exampleClient.execute(example1Request);
Example2Request example2Request = new Example2Request();
Example2Response execute2 = exampleClient.execute(example2Request);
}
使用泛型约束 SDK 的出入参
https://cloop.zone.id/posts/technology/request-with-response-in-sdk/
作者
Cloop
发布于
2025-05-15
许可协议
CC BY-NC-SA 4.0