首頁 > 後端開發 > php教程 > 用php-http和httplug脫離guzzle5

用php-http和httplug脫離guzzle5

Jennifer Aniston
發布: 2025-02-16 10:04:15
原創
290 人瀏覽過

用php-http和httplug脫離guzzle5

鑰匙要點

    PHP-HTTP的項目
  • httplug,允許將任何HTTP客戶端輕鬆注入SDK,為已經使用的HTTP客戶端提供的應用程序提供解決方案,並希望避免使用Guzzle。
  • > httplug接口軟件包和guzzle 6可以使用作曲家需要php-http/guzzle6-apapter命令。這允許使用Guzzle 6或任何其他實現HTTPLUG的HTTPCLIENT接口的適配器。 > PHP-HTTP項目的旨在為PHP中的所有HTTP客戶端(包括Guzzle 5和6)以及Zend1和2和Zend1和2。這允許與已安裝的客戶端版本和適當的適配器輕鬆插入相應的適配器。
  • > difbot SDK已成為PSR-7兼容,並接受了其他HTTP客戶端的實現。它只需要一個適配器,尊重HTTPLUG接口才能開箱即用。
  • httplug提供了一種在應用程序中抽象HTTP客戶端實現的新方法,為一層抽象的成本提供了可擴展的性能。
  • >
  • 本文由MárkSági-Kazár和David Buchmann進行了同行評審。感謝SitePoint所有的同行評審器製作SitePoint內容的最佳功能!
  • 在上一個系列中,我們為Diffbot構建了PHP客戶端。客戶端運行良好,並且在相對廣泛的使用中 - 我們甚至在實時應用程序上測試了它以確保其取決於標準桿 - 但這在很大程度上取決於Guzzle5。
  • 有兩個問題:

guzlezz 6已經淘汰,並支持PSR 7。雖然Guzzle索賠的作者在可預見的將來將支持Guzzle 5的支持,但持懷疑態度的壽命更加安全。此外,雖然PSR 7可能有其怪癖,但如果僅與其他項目兼容,則遵循PSR是很好的。 有人在其應用中實現我們的客戶端的人可能已經使用了首選的HTTP客戶端,並且希望使用他們的而不是guzzle。我們應該允許在我們的SDK中輕鬆注入任何

http客戶端。

巧合的是,有一個新項目允許我們這樣做:httplug。

  1. >
  2. 注意:您不必熟悉DiffBot SDK的內部邏輯即可進行。本文中的過程適用於具有混凝土HTTP客戶端實現的任何軟件包,並且易於遵循。
  3. > php-http和httplug PHP-HTTP是PHP中HTTP相關工具的GITHUB組織。它提供HTTPLUG,一個接口的集合和例外,以在PSR-7請求和響應之上定義最小的HTTP客戶端合同。本合同的實現提供
  4. 虛擬軟件包php-http/client-implement。

這意味著使用Guzzle 6 CAN CAN CAN的人需要PHP-HTTP/Guzzle6-Adapter才能吸入適配器,HTTPLUG接口軟件包,而Guzzle 6本身作為適配器的依賴。

httplug是可重複使用軟件包的入口點。所有客戶端(例如Guzles6適配器)均基於客戶抽象。然後,這些客戶進一步利用其基本軟件包 /依賴項 - 在這種情況下,Guzzle 6。

>所以,下到頂:

http客戶端存在(guzzle 6)
    >
  • guzzle 6適配器是用httplug作為其接口構建的
  • 一個需要能夠使HTTP調用需要客戶端的應用程序,需要HTTPLUG的HTTPCLIENT接口,而不是Guzzle 6直接 然後,該應用程序可以使用Guzzle 6,或實現HTTPLUG的HTTPCLIENT接口並包裝另一個第三方HTTP客戶端的任何其他適配器
  • >該團隊的計劃最終是在PHP Land:Guzzle 6,Guzzle 5,Zend2,Zend1等中所有各種HTTP客戶端的最大支持客戶端版本,並且只需將適當的適配器插入混合物。
  • >
  • 請注意,我們使用術語
  • 適配器

client

>在這裡幾乎可以互換 - 基於HTTPLUG的適配器都是。他們是圍繞現有客戶的包裝器,但直接用作客戶自己。

我們在這篇文章中的計劃是用httplug版本替換difbot php客戶端的混凝土guzzle 5的依賴。 >注意:httplug和相關軟件包是alpha軟件,因此可能會更改。將任何東西轉換為使用它們都是有冒險的努力。

>

>引導

>像往常一樣,建議我們使用改進的宅基地來引導我們的環境。準備好後,我們可以克隆並測試SDK的當前穩定版本:>

最後一個命令假設phpunit已在開發環境上進行全局安裝。

所有測試都應通過(除了因某些胡說八道而被漏洞且無法混合的測試),因此我們準備開始轉換。

>

入門

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
登入後複製
登入後複製
登入後複製
登入後複製
首先,我們需要創建一個新的分支來開發此升級。

然後,我們將兩個依賴項添加到我們的composer.json文件中:>

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
登入後複製
登入後複製
登入後複製
登入後複製

這是告訴客戶從現在開始的,這取決於a虛擬軟件包 - 這個。這意味著要使用,使用我們的Diffbot客戶端的應用程序(如此)必須選擇此軟件包的實現(在Packagist上列出的鏈接中列出的一個)。當然,在包裝的開發過程中,不可能測試並查看所有事物是否在沒有實際實施的情況下工作,因此我們指定了額外的要求依賴性。在上面的具體情況下,我們使用“ php-http/guzzle6-apapter”:“ 〜0.2@dev”。我們之所以選擇該特定版本只是因為它是最新的版本,而且沒有穩定的版本。

>

注意:您可能想知道為什麼我們使用將值添加到composer.json中的方法,而不是像平時一樣在終端中互動地聲明依賴項。這是因為在虛擬軟件包上做作曲家需要的需要會丟失錯誤 - 該軟件包實際上並不存在,只是它的虛擬名稱,佔位符,因此作曲家會感到困惑不知道該安裝什麼。有一個問題暗示對此有所改變,但不太可能很快發生。 >由於PHP-HTTP軟件包仍處於繁重的開發中,因此我們應該在Composer.json文件中添加以下兩個值:

>這是允許安裝開發軟件包(不穩定),但如果存在,則更喜歡穩定的版本。因此,它不會拿出高度不穩定的phpunit 5.2.x,而是將獲取5.0.8(在撰寫本文時最新),但如果我們要求它提供沒有的包裹,它也將成功穩定的版本(例如Guzzle6-apapter)。

如果我們打算安裝guzlezz6,
git checkout -b feature-httplug
登入後複製
登入後複製
登入後複製
我們還需要刪除對Guzzle5的依賴性。最終的需求塊看起來像這樣:

計劃

SDK當前工作的方式如下:在Main DiffBot類中,我們可以選擇設置httpclient。當前,這是在版本5上的Guzles實現。如果未設置自定義客戶端實例,則DiffBot類自動使用默認客戶端。 然後,API摘要的呼叫方法將使用此客戶端來向給定的URL發出GET請求。此外,在爬網API類和搜索API類中有一個自定義調用方法。
	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
登入後複製
登入後複製
登入後複製
>

呼叫的結果被保存為$響應,這是一個guzzle5響應。然後,該響應由實體工廠進行處理,該工廠檢查其有效性並從中構建實體,將其推入實體迭代器。

因此,該計劃是:

>

  1. >用一種接受httplug實現的方法替換difbot :: sethttpclient
  2. >修改API摘要,爬網和搜索類調用方法,以便他們可以通過提供給他們的任何HTTP客戶端實現來發出get請求。
  3. >
  4. >修改實體工廠和實體迭代器,以便它們不再依賴於響應的guzzle5版本,而是PSR-7對應器。
  5. PHP-HTTP項目具有附加軟件包UTITS,其中包含HTTPMethodSclient。該類將消息工廠和HTTP客戶端包裝成一個整體,從而更輕鬆地使用常用動詞(例如get,post等)發送請求,從而轉化為與我們到目前為止所擁有的類似的內容:$ client-> get(。 ..)。更重要的是,它還返回PSR-7響應界面,這意味著我們可以使用getbody方法 - 僅將tojson方法毫無用處,我們可以輕鬆地做到這一點。
>

>此外,該項目還具有發現組件,該組件具有一些用於發現已安裝工廠和客戶的靜態類- 這使我們能夠在某些情況下為最終用戶提供零型配置經驗(請參閱文檔)。

>制定戰鬥計劃,我們可以開始重構。

>先決條件

讓我們需要其他軟件包:

> difbot類

difbot類在頂部具有以下線:
git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
登入後複製
登入後複製
登入後複製
登入後複製

我們可以將其更改為:

>

> sethttpclient方法現在應該在IDE中爆發,稱其缺少某些必需的參數,即客戶使用的客戶以及用於構建請求實例的消息工廠。
git checkout -b feature-httplug
登入後複製
登入後複製
登入後複製
該方法應被重構為:

	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
登入後複製
登入後複製
登入後複製
>另外,可以在類頂部以使用語句導入發現類。 >

此更改現在使Diffbot SDK的最終用戶可以:

>安裝了自己的客戶端,讓發現組件與httpmethodsclient同時自動照顧事物,或

>通過將PSR 7客戶端的自定義實例注入其新實例中,並將
"prefer-stable": true,
"minimum-stability": "dev"
登入後複製
登入後複製
>注入

大多數用戶將在Autopilot上使用它。

    api摘要,爬網和搜索
  • 接下來,呼叫方法。
因為我們之前實現的httpmethodsclient實例具有GET方法,因此在這方面不需要更改。但是,$響應實例顯示了一個誤匹配,並且有充分的理由。 EntityFactory預期的原始$響應是Guzzle5響應。

由於EntityFactory發出的投訴,我們實際上不需要編輯API摘要 - 它將自行處理事情。爬網類的呼叫對手有些不同:

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
登入後複製
登入後複製
登入後複製
登入後複製

>這裡的兩個警告 - 使用$響應的JSON方法的第二行,以及期望Guzzle5響應的實體實例化。從這裡開始我們唯一可以影響的線就是前者,所以讓我們將其更改為:

git checkout -b feature-httplug
登入後複製
登入後複製
登入後複製
>在搜索類呼叫方法中需要進行類似的更改,其中

	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
登入後複製
登入後複製
登入後複製

更改為:

"prefer-stable": true,
"minimum-stability": "dev"
登入後複製
登入後複製

實體工廠

實體類別具有以下導入:

    "require": {
        "php" : ">=5.4.0",
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        "symfony/var-dumper": "~2",
        "phpunit/phpunit": "^5.0",
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
登入後複製
我們可以將其更改為:

composer require "php-http/utils" "php-http/discovery"
登入後複製
>在EntityFactory類實施的EntityFactory界面中,需要完成相同的操作。

另一個變化與我們在爬網類中所做的相似。我們更改:

use GuzzleHttp\Client;
登入後複製
>

在checkResponseFormat和createApprepreTerator方法中
use Http\Client\Utils\HttpMethodsClient as Client;
登入後複製
>

>

>實體迭代

我們更改:

<span>/**
</span><span> * Sets the client to be used for querying the API endpoints
</span><span> *
</span><span> * <span>@param Client $client
</span></span><span> * <span>@see http://php-http.readthedocs.org/en/latest/utils/#httpmethodsclient
</span></span><span> * <span>@return $this
</span></span><span> */
</span><span>public function setHttpClient(Client $client = null)
</span><span>{
</span>    <span>if ($client === null) {
</span>		<span>$client = new Client(
</span>		   <span><span>\Http\Discovery\HttpClientDiscovery</span>::find(),
</span>		   <span><span>\Http\Discovery\MessageFactoryDiscovery</span>::find()
</span>		<span>);
</span>    <span>}
</span>    <span>$this->client = $client;
</span>    <span>return $this;
</span><span>}
</span>
登入後複製
>

<span>public function call()
</span><span>{
</span>    <span>$response = $this->diffbot->getHttpClient()->get($this->buildUrl());
</span>
    <span>$array = $response->json();
</span>
    <span>if (isset($array['jobs'])) {
</span>        <span>$jobs = [];
</span>        <span>foreach ($array['jobs'] as $job) {
</span>            <span>$jobs[] = new JobCrawl($job);
</span>        <span>}
</span>
        <span>return new EntityIterator($jobs, $response);
</span>    <span>} elseif (!isset($array['jobs']) && isset($array['response'])) {
</span>        <span>return $array['response'];
</span>    <span>} else {
</span>        <span>throw new DiffbotException('It appears something went wrong.');
</span>    <span>}
</span><span>}
</span>
登入後複製
>測試

嘲笑,測試HTTP請求和API調用的主要方式在Guzzle 6中是不同的,因此我們的測試需要大修稍大。

>由於本教程已經有點長,如果您有興趣學習Guzzle 5和Guzzle 6之間的模擬差異,請參閱相關的功能分支,具體來說是Diffbot SDK的兩個版本之間。

最後,讓我們進行測試:>

成功!所有通過(預期跳過測試除外)。

$array = json_decode($response->getBody(), true);
登入後複製
> difbot SDK現在不僅兼容PSR-7,而且還可以接受HTTP客戶端的其他實現。它所需要的只是一個尊重Httplug接口的適配器,所有內容都應該從開箱即用。

結論

HTTPLUG是一種有用的新方法,用於在我們構建的應用程序中抽象HTTP客戶端實現。無論我們是自己構建HTTP客戶端還是在其他應用中使用它們,PHP-HTTP都為一個額外的抽象層的合理價格提供了一個全新的新世界。

>

如果您想通過添加更多適配器實現來提供幫助,或者僅通過嘗試包裝並提供反饋,則團隊歡迎所有貢獻。取得聯繫,或將反饋留在下面的評論部分中,如果您覺得本教程有趣,請不要忘記點擊該按鈕!

>

經常詢問有關php http和httplug

的問題(常見問題解答)

guzzle5和php http/httplug?

guzzle5和php http/httplug之間有什麼區別。 Guzzle5是特定的HTTP客戶端,而PHP HTTP是一個抽象層,可讓您使用任何HTTP客戶端。 HTTPLUG是PHP HTTP的擴展,可提供其他功能。主要區別在於,PHP HTTP和HTTPLUG允許更具靈活性和互操作性,因為它們不與特定的HTTP客戶端綁定。

如何從Guzzle5到PHP HTTP/HTTPLUG? >從Guzzle5遷移到PHP HTTP/HTTPLUG涉及使用實現PHP HTTP接口的適配器替換Guzzle5客戶端。這可以使用HTTPLUG庫來完成,該庫為包括Guzzle5在內的各種HTTP客戶端提供適配器。設置適配器後,您可以使用php http方法發送請求並處理響應。

>使用php http/httplug而不是guzzle5>在Guzzle5上使用PHP HTTP/HTTPLUG是靈活性和互操作性的提高。使用PHP HTTP/HTTPLUG,您可以在不同的HTTP客戶端之間切換,而無需更改代碼。這使得與不同客戶端測試應用程序並在必要時更換客戶端更加容易。此外,HTTPLUG提供了一個插件系統,該系統允許您在HTTP客戶端添加功能。

如何安裝PHP http/httplug?

php http/httplug PHP的依賴關係管理工具。您可以通過運行命令作曲家需要PHP-HTTP/HTTPLUG來安裝它。這將下載httplug庫及其依賴項。

>如何使用php http/httplug發送請求?

發送帶有php http/httplug的請求,您首先需要創建請求對象。可以使用MessageFactory接口的CreaterEquest方法完成。有一個請求對像後,您可以使用httpclient接口的sendRequest方法發送它。

>

>如何使用php http/httplug? >

> php http/httplug中發現組件的目的是什麼? PHP HTTP/HTTPLUG中的發現組件用於自動查找和使用可用的HTTP適配器和消息廠。這使得更容易在不同的HTTP客戶端進行切換並使用最佳可用實現。

如何在PHP HTTP/HTTPLUG中使用Discovery Component?在HTTPCLIENTDISCOVERY或MESSEARSFACTORYDISCOVERY類中調用靜態查找方法。這將返回第一個可用的http客戶端或消息工廠的實例。

> httplug中的插件是什麼,我如何使用它們?

插件httplug中的插件用於向HTTP客戶端添加功能。它們可用於添加身份驗證,緩存和錯誤處理之類的功能。可以使用插件類的AddPlugin方法將插件添加到客戶端中。

>

>如何處理php http/httplug中的錯誤?

實現HTTPClientException接口。您可以捕獲這些例外並根據需要處理它們。此外,您可以使用errorplugin自動將非2000響應轉換為例外。

以上是用php-http和httplug脫離guzzle5的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板