目錄
鑰匙要點
所有測試都應通過(除了因某些胡說八道而被漏洞且無法混合的測試),因此我們準備開始轉換。
我們可以將其更改為:
實體工廠
>

經常詢問有關php http和httplug

guzzle5和php http/httplug?
php http/httplug PHP的依賴關係管理工具。您可以通過運行命令作曲家需要PHP-HTTP/HTTPLUG來安裝它。這將下載httplug庫及其依賴項。
>
> httplug中的插件是什麼,我如何使用它們?
首頁 後端開發 php教程 用php-http和httplug脫離guzzle5

用php-http和httplug脫離guzzle5

Feb 16, 2025 am 10:04 AM

用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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1305
25
PHP教程
1251
29
C# 教程
1224
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是REST API設計原理? 什麼是REST API設計原理? Apr 04, 2025 am 12:01 AM

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中的匿名類是什麼?您何時可以使用它們? PHP中的匿名類是什麼?您何時可以使用它們? Apr 04, 2025 am 12:02 AM

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

See all articles