✅ 背景与需求
需要基于 OkHttp 框架封装一个 HTTP 客户端,用于调用外部服务接口(如拼团回调),实现以下功能:
- 动态传入请求地址(URL)
- 支持 JSON 请求体
- 实现类放在 infrastructure 层的 gateway 包下
- 接口定义在 domain 层,实现类为 GroupBuyNotifyService
✅ 项目结构参考
java
group-buy-market
├── group-buy-market-domain
│ └── src/main/java/cn/bugstack/domain/trade/service/settlement/notify/GroupBuyNotifyService.java
├── group-buy-market-infrastructure
│ └── src/main/java/cn/bugstack/infrastructure/gateway/GroupBuyNotifyGateway.java
✅接口设计
1. 领域层接口(定义在 domain )
java
// GroupBuyNotifyService.java
package cn.bugstack.domain.trade.service.settlement.notify;
import cn.bugstack.domain.trade.model.entity.NotifyTaskEntity;
import java.util.Map;
public interface GroupBuyNotifyService {
String groupBuyNotify(NotifyTaskEntity notifyTaskEntity);
}
2. 基础设施层实现(定义在 infrastructure )
java
// GroupBuyNotifyGateway.java
package cn.bugstack.infrastructure.gateway;
import cn.bugstack.domain.trade.model.entity.NotifyTaskEntity;
import cn.bugstack.domain.trade.service.settlement.notify.GroupBuyNotifyService;
import com.alibaba.fastjson.JSON;
import okhttp3.*;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Service
public class GroupBuyNotifyGateway implements GroupBuyNotifyService {
private final final OkHttpClient httpClient;
public GroupBuyNotifyGateway(OKHttpClientConfig okHttpClientConfig) {
this.httpClient = okHttpClientConfig.getOkHttpClient();
}
@Override
public String groupBuyNotify(NotifyTaskEntity notifyTaskEntity) {
String url = notifyTaskEntity.getNotifyUrl(); // 动态 URL
String requestBody = JSON.toJSONString(notifyTaskEntity); // 请求体
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(requestBody, MediaType.get("application/json; charset=utf-8")))
.build();
try (Response response = httpClient.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().string();
} else {
return "HTTP_ERROR";
}
} catch (IOException e) {
e.printStackTrace();
return "NETWORK_ERROR";
}
}
}
✅ 配置类(OkHttpClient 配置)
java
// OKHttpClientConfig.java
package cn.bugstack.infrastructure.config;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
@Configuration
public class OKHttpClientConfig {
@Bean
public OkHttpClient okHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(Duration.ofSeconds(10))
.readTimeout(Duration.ofSeconds(30))
.writeTimeout(Duration.ofSeconds(30))
.build();
}
public OkHttpClient getOkHttpClient() {
return okHttpClient();
}
}
✅ 总结功能
|----------|----------------------------------------|
| 功能 | 实现方式 |
| 动态 URL | 从 notifyTaskEntity.getNotifyUrl() 获取 |
| 请求体 | 使用 FastJSON 序列化 NotifyTaskEntity |
| HTTP 客户端 | 使用 OkHttpClient 发送 POST 请求 |
| 异常处理 | 捕获 IO 异常并返回错误码 |
| 分层结构 | 接口在 domain,实现类在 infrastructure/gateway |