✅ 背景与需求
需要基于 OkHttp 框架封装一个 HTTP 客户端,用于调用外部服务接口(如拼团回调),实现以下功能:
- 动态传入请求地址(URL)
- 支持 JSON 请求体
- 实现类放在 infrastructure 层的 gateway 包下
- 接口定义在 domain 层,实现类为 GroupBuyNotifyService
✅ 项目结构参考
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)
// 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)
// 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();}@Overridepublic String groupBuyNotify(NotifyTaskEntity notifyTaskEntity) {String url = notifyTaskEntity.getNotifyUrl(); // 动态 URLString 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 配置)
// 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 {@Beanpublic 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 |