laravel中請求失敗重試的擴展--Guzzle

背景

開發過程中,跟外部接口對接時,很常見的要考慮到失敗重新的情況,這里記錄一下我用的失敗重試的情況,

重試方法

1、使用 Laravel 的 HTTP 客戶端和異常處理

結合異常處理和重試邏輯

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\RequestException;try {$response = Http::get('http://example.com/api/endpoint');$response->throw();
} catch (RequestException $e) {// 可以根據異常類型或狀態碼決定是否重試if ($e->response && $e->response->status() >= 500) {// 重試邏輯,例如重新發送請求$response = Http::get('http://example.com/api/endpoint');}
}
2、Guzzle 及其重試中間件

文檔地址:https://docs.guzzlephp.org/en/stable/quickstart.html#creating-a-client

Guzzle 是一個廣泛使用的 HTTP 客戶端,并且有相應的重試中間件可以實現請求失敗的重試。

2.1安裝擴展
composer require guzzlehttp/guzzle
2.2失敗重試邏輯
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7\Response;class YourHttpClientClass {// 自定義的重試決策函數public static function retryDecider() {return function ($retries, $request, $response = null, $exception = null) {if ($retries >= 3) {return false;}if ($exception instanceof \GuzzleHttp\Exception\ConnectException) {return true;}if ($response) {// 如果請求有響應,這里根據自己的業務而定,是否繼續重試$res_content = $response->getBody()->getContents();$res = json_decode($res_content, true);if (isset($res['error'])) { // 如果不存在status ,更新access_token,再次請求info('接口請求結果: '. json_encode($res) . '需要刷新access_token重新請求');self::getProAccessToken($refresh = true);return true;}}return false;};}// 自定義的重試延遲函數public static function retryDelay() {return function ($numberOfRetries) {return 1000 * $numberOfRetries; // 延遲 1 秒,重試次數越多延遲越長};}public function createClient() {// 創建處理棧并使用 CurlHandler$handlerStack = HandlerStack::create(new CurlHandler());// 創建 mapResponse 中間件$mapResponse = Middleware::mapResponse(function (Response $response) {$response->getBody()->rewind();return $response;});// 創建重試中間件,指定決策者為 retryDecider(),指定重試延遲為 retryDelay()$handlerStack->push($mapResponse);// 創建重試中間件$handlerStack->push(Middleware::retry(self::retryDecider(), self::retryDelay()));// 創建 Guzzle 客戶端$http_client = new Client(['handler' => $handlerStack,'connect_timeout' => 5,        // 連接超時 5 秒鐘'read_timeout' => 20,           // 讀取內容超時 20 秒鐘'timeout' => 30,                // 總超時 30 秒鐘'verify' => true,              // 檢查 ssl'http_errors' => false,         // 暫時忽略 http 錯誤,但后續需檢查狀態碼'force_ip_resolve' => 'v4',     // 強制使用 IPV4 解析地址'headers' => ['Ocp-Apim-Subscription-Key' => config('jpro.vpcx.api_key') ],]);if (strtolower($method) == 'get') {$options = ['query' =>  $data ];$res = $http_client->request('get', $api_url, $options)->getBody()->getContents();} elseif (strtolower($method) == 'post') {$res = $http_client->request('post', $api_url, ['form_params' =>  $data,])->getBody()->getContents();}return $res;}
}

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

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

相關文章

ThinkPHP 8的一對多關聯

【圖書介紹】《ThinkPHP 8高效構建Web應用》-CSDN博客 《2025新書 ThinkPHP 8高效構建Web應用 編程與應用開發叢書 夏磊 清華大學出版社教材書籍 9787302678236 ThinkPHP 8高效構建Web應用》【摘要 書評 試讀】- 京東圖書 使用VS Code開發ThinkPHP項目-CSDN博客 編程與應用開…

工業網口相機:如何通過調整網口參數設置,優化圖像傳輸和網絡性能,達到最大幀率

項目場景 工業相機是常用與工業視覺領域的常用專業視覺核心部件,擁有多種屬性,是機器視覺系統中的核心部件,具有不可替代的重要功能。 工業相機已經被廣泛應用于工業生產線在線檢測、智能交通,機器視覺,科研,軍事科學,航天航空等眾多領域 …

java使用poi-tl自定義word模板導出

文章目錄 概要整體架構流程創建word模板核心代碼導出結果 概要 在軟件開發領域,自定義Word模板的使用是導出格式化數據的一種常見做法。poi-tl(Apache POI Template Language)作為一款基于廣受認可的Apache POI庫的Word模板引擎,…

IDEA2023版中TODO的使用

介紹:TODO其實本質上還是注釋,只不過加上了TODO這幾個字符,可以讓使用者快速找到。 注意:在類、接口等文件中,注釋是使用// 即:// TODO 注釋內容 在配置文件中,注釋是使用# 即:# TO…

項目練習:若依管理系統字典功能-Vue前端部分

文章目錄 一、情景說明二、若依Vue相關代碼及配置1、utils代碼2、components組件3、api接口代碼4、Vuex配置5、main.js配置 三、使用方法1、html部分2、js部分 一、情景說明 我們在做web系統的時候,肯定會遇到一些常量選擇場景。 比如,性別:…

LabVIEW開發X光圖像的邊緣檢測

在醫療影像處理中,X光圖像的分析對于骨折、腫瘤等病變的檢測非常重要。X光圖像中包含許多關鍵信息,然而,由于圖像噪聲的干擾,直接從圖像中提取有用的特征(如骨折的邊緣)變得非常困難。邊緣檢測作為圖像處理…

【CC2640R2F】香瓜CC2640R2F之SPI讀寫W25Q80

本文最后修改時間:2022年01月08日 10:45 一、本節簡介 本節以simple_peripheral工程為例,介紹如何使用SPI讀寫W25Q80(外部flash)。 二、實驗平臺 1)CC2640R2F平臺 ①協議棧版本:CC2640R2 SDK v1.40.00.4…

光譜相機如何還原色彩

多光譜通道采集 光譜相機設有多個不同波段的光譜通道,可精確記錄每個波長的光強信息。如 8 到 16 個甚至更多的光譜通道,每個通道負責特定波長范圍的光信息記錄。這使得相機能分辨出不同光譜組合產生的相同顏色感知,而傳統相機的傳感器通常只…

C# 獲取PDF文檔中的字體信息(字體名、大小、顏色、樣式等

在設計和出版行業中,字體的選擇和使用對最終作品的質量有著重要影響。然而,有時我們可能會遇到包含未知字體的PDF文件,這使得我們無法準確地復制或修改文檔。獲取PDF中的字體信息可以解決這個問題,讓我們能夠更好地處理這些文件。…

C++ 的 CTAD 與推斷指示(Deduction Guides)

1 類模板參數推導(CTAD) 1.1 曲線救國 ? CTAD 的全稱是類模板參數推導(Class Template Argument Deduction),它允許在實例化類模板時,根據構造函數的參數類型自動推導模板參數,從而避免顯式指…

Shell正則表達式與文本處理三劍客(grep、sed、awk)

一、正則表達式 Shell正則表達式分為兩種: 基礎正則表達式:BRE(basic regular express) 擴展正則表達式:ERE(extend regular express),擴展的表達式有、?、|和() 1.1 基本正則表…

掌握 React 高階組件與高階函數:構建可復用組件的新境界

一、引言 在 React 開發中,代碼復用性和邏輯分離是提高開發效率和維護性的重要手段。高階組件(Higher-Order Component, HOC)和高階函數(Higher-Order Function, HOF)是實現這一目標的兩種強大工具。本文將詳細介紹這…

arcgis提取不規則柵格數據的矢量邊界

效果 1、準備數據 柵格數據:dem或者dsm 2、柵格重分類 分成兩類即可 3、新建線面圖層 在目錄下選擇預先準備好的文件夾,點擊右鍵,選擇“新建”→“Shapefile”,新建一個Shapefile文件。 在彈出的“新建Shapefile”對話框內“名稱”命名為“折線”,“要素類型”選…

阿里云通義實驗室自然語言處理方向負責人黃非:通義靈碼2.0,邁入 Agentic AI

通義靈碼是基于阿里巴巴通義大模型研發的AI 智能編碼助手,在通義靈碼 1.0 時代,我們針對代碼的生成、補全和問答,通過高效果、低時延,研發出了國內最受歡迎的編碼助手。 在通義靈碼 2.0 發布會上,阿里云通義實驗室自然…

Open3D 最小二乘擬合平面(直接求解法)【2025最新版】

目錄 一、算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT。 博客長期更新,本文最近更新時間為:2025年1月18日。 一、算法原理 平面方程的一般表達式為:

超標量處理器設計2-cache

1. cache 介紹 影響Cache缺失的情況有3種: Compulsory: 第一次被訪問的指令或者數據肯定不會在cache中,需要通過預取來減少這種缺失Capcity: Cache容量越大,缺失就可以更少, 程序頻繁使用的三個數據來源于3個set, 但是&#xff…

linux 安裝PrometheusAlert配置釘釘告警

在 Linux 上安裝 PrometheusAlert 并配置釘釘告警的步驟如下: 1. 準備工作 釘釘機器人: 在釘釘群中創建一個機器人,獲取 Webhook URL。示例 Webhook URL:https://oapi.dingtalk.com/robot/send?access_token=your_dingtalk_token。PrometheusAlert 安裝包: 從 Prometheus…

當PHP遇上區塊鏈:一場奇妙的技術之旅

PHP 與區塊鏈的邂逅 在技術的廣袤宇宙中,區塊鏈技術如同一顆耀眼的新星,以其去中心化、不可篡改、透明等特性,掀起了一場席卷全球的變革浪潮。眾多開發者懷揣著對新技術的熱忱與探索精神,紛紛投身于區塊鏈開發的領域,試…

vscode的安裝與使用

下載 地址:https://code.visualstudio.com/ 安裝 修改安裝路徑(不要有中文) 點擊下一步,創建桌面快捷方式,等待安裝 安裝中文插件 可以根據自己的需要安裝python和Jupyter插件

32單片機綜合應用案例——物聯網(IoT)環境監測站(四)(內附詳細代碼講解!!!)

無論你身處何種困境,都要堅持下去,因為勇氣和毅力是成功的基石。不要害怕失敗,因為失敗并不代表終結,而是為了成長和進步。相信自己的能力,相信自己的潛力,相信自己可以克服一切困難。成功需要付出努力和堅…