OkHttp 框架封裝一個 HTTP 客戶端,用于調用外部服務接口

? 背景與需求

需要基于 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89280.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Collections.max比較Map<String, Integer>中的最大值

文章目錄使用Collections.max比較Map<String, Integer>中的最大值基本方法1. 比較Map的值2. 比較Map的鍵自定義比較器1. 按值降序排列2. 復雜比較邏輯完整示例代碼性能考慮替代方案1. 使用Stream API (Java 8)2. 手動遍歷實際應用場景注意事項總結使用Collections.max比較…

鴻蒙狀態欄操作

1.鴻蒙設備基礎信息 1.1圖解 1.1窗口內容規避區域 AvoidArea7 窗口內容規避區域。 窗口內容規避區域。如系統欄區域、劉海屏區域、手勢區域、軟鍵盤區域等與窗口內容重疊時&#xff0c;需要窗口內容避讓的區域。在規避區無法響應用戶點擊事件。 除此之外還需注意規避區域的如…

Product Hunt 每日熱榜 | 2025-07-17

1. Brain MAX by ClickUp 標語&#xff1a;一款AI應用統治一切&#xff1a;你的知識 語音轉文字 介紹&#xff1a;Brain MAX 是 ClickUp 完全原生的桌面應用&#xff0c;旨在提升生產力&#xff0c;幫助你擺脫 AI 的雜亂無章。只需每月 9 美元&#xff0c;就可以使用所有的 …

如何使用VScode使用ssh連接遠程服務器不需要輸入密碼直接登錄

ssh-keygen 之后一直默認 回車 確認即可結果 (base) amaxamax:/data/std$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/amax/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:…

vue實現el-table-column中自定義label

vue實現el-table-column中自定義label<el-table-columnlabel"操作"align"left"width"50"><template #header><div><el-buttonsize"mini"type"primary"icon"el-icon-plus"circle></el-…

Vue 常用的 ESLint 規則集

對Vue項目來說&#xff0c;Vue 官方通過 eslint-plugin-vue 提供了多個規則集&#xff08;Rule Sets&#xff09;&#xff0c;適用于不同嚴格度和 Vue 版本。以下是主要的規則集及其對應的 ESLint 插件和用途&#xff1a; 1. Vue 2.x 規則集 適用于 Vue 2 項目&#xff0c;規則…

AbMole小課堂 | Angiotensin II(血管緊張素Ⅱ)在心血管研究中的多元應用

Angiotensin II&#xff08;血管緊張素Ⅱ&#xff0c;AbMole&#xff0c;M6240&#xff09;是一種血管收縮劑&#xff0c;也是腎素-血管緊張素系統 (RAS) 的主要效應肽。Angiotensin II參與動物的血壓調節、水電解質平衡等經典生理過程在科研中Angiotensin II被廣泛用于動物心血…

【Unity】Mono相關理論知識學習

一種編譯技術。優點&#xff1a;支持JIT編譯&#xff1a;在運行時將IL編譯成機器碼。首次執行稍慢&#xff0c;好處在于運行更快&#xff0c;迭代更高效。構建速度快&#xff1a;無需將IL轉成C&#xff0c;構建過程省去了IL2CPP的轉換和原生編譯步驟&#xff0c;適合開發階段快…

React源碼4 三大核心模塊之一:Schedule,scheduleUpdateOnFiber函數

scheduler工作階段在React內部被稱為schedule階段。在《React源碼3》&#xff0c;我們已經將update加入隊列并返回到了根容器節點root。function updateContainer(element, container, parentComponent, callback) {//前面略過var root enqueueUpdate(current$1, update, lane…

Unity3D + VS2022連接雷電模擬器調試

本文參考了Unity3D Profiler 連接真機和模擬器_unity 連接雷電模擬器-CSDN博客 具體步驟&#xff1a; 1、cmd打開命令窗口&#xff0c;輸入adb devices&#xff0c;確認能檢測到模擬器 示例&#xff1a;List of devices attached emulator-5554 device 2、…

學習軟件測試的第十五天

1.會寫測試用例嗎&#xff1f;測試用例有什么要素“會的&#xff0c;我寫過多個功能測試和接口測試的測試用例。我寫用例的時候會根據需求文檔或原型圖分析測試點&#xff0c;然后從正常流程、異常流程、邊界情況等方面設計測試場景。每條用例我都會包含&#xff1a;用例編號、…

C++硬實時調度:原理、實踐與最佳方案

在工業自動化、航空航天、醫療設備等領域&#xff0c;系統的實時性往往直接關系到生命安全和財產損失。C作為高性能編程語言&#xff0c;為硬實時系統開發提供了強大支持。本文將深入探討C硬實時調度的核心技術&#xff0c;從操作系統原理到代碼實現的全方位解析。 一、實時系統…

LeetCode 1156.單字符重復子串的最大長度

如果字符串中的所有字符都相同&#xff0c;那么這個字符串是單字符重復的字符串。 給你一個字符串 text&#xff0c;你只能交換其中兩個字符一次或者什么都不做&#xff0c;然后得到一些單字符重復的子串。返回其中最長的子串的長度。 示例 1&#xff1a; 輸入&#xff1a;text…

K近鄰算法的分類與回歸應用場景

K近鄰算法的分類與回歸應用場景 K近鄰&#xff08;K-Nearest Neighbors, KNN&#xff09;算法是一種基礎但強大的機器學習方法&#xff0c;它既可以用于分類問題&#xff0c;也能解決回歸問題。 兩者的核心思想都是基于"近朱者赤&#xff0c;近墨者黑"的原理&#xf…

算法精講--正則表達式(二):分組、引用與高級匹配技術

算法精講–正則表達式&#xff08;二&#xff09;&#xff1a;分組、引用與高級匹配技術 &#x1f680;正則表達式的真正力量在于組合使用各種語法元素&#xff0c;創造出強大而精確的匹配模式&#xff01; —— 作者&#xff1a;無限大 推薦閱讀時間&#xff1a;25 分鐘 適用人…

python+requests 接口自動化測試實戰

首先介紹一下python的requests模塊&#xff1a; requests的使用介紹&#xff1a;requests快速入門 Python結合requests庫實現接口自動化測試環境說明&#xff1a; 1.WIN 7, 64位 2.Python3.4.3 &#xff08;pip-8.1.2&#xff09; 3.Requests —>pip install requests 4.U…

NAT 實驗

NAT 實驗 一.實驗拓撲圖實驗目的 1.按照圖示配置 IP 地址 2.私網 A 通過 R1 接入到互聯網&#xff0c;私網 B 通過 R3 接入到互聯網 3.私網 A 內部存在 Vlan10 和 Vlan20&#xff0c;通過 R1 上單臂路由訪問外部網絡 4.私網 A 通過 NAPT 使 Vlan10 和 Vlan20 都能夠使用 R1 的公…

buuctf——web刷題第三頁

第三頁 目錄 [FBCTF2019]RCEService [0CTF 2016]piapiapia [Zer0pts2020]Can you guess it? [WUSTCTF2020]顏值成績查詢 [SUCTF 2019]Pythonginx [MRCTF2020]套娃 [CSCCTF 2019 Qual]FlaskLight [watevrCTF-2019]Cookie Store [WUSTCTF2020]CV Maker [紅明谷CTF 202…

前后端分離項目中的接口設計與調用流程——以高仙機器人集成為例

一、背景介紹在前后端分離項目開發中&#xff0c;前端頁面需要頻繁調用后端接口獲取數據。在高仙機器人對接項目中&#xff0c;我們采用了若依&#xff08;RuoYi&#xff09;框架&#xff0c;前端通過統一的 API 封裝與后端進行數據交互&#xff0c;而后端再對接高仙官方的 OPE…

【第五節】部署http接口到ubuntu server上的docker內

描述清楚需求&#xff0c;讓deepseek幫我們寫一個demo&#xff0c;文件結構如下 FLASK_API_001 ├── app.py └── Dockerfile └── requirements.txtapp.pyfrom flask import Flask, jsonify, requestapp Flask(__name__)# 根路由 app.route(/) def home():return "…