用php-http和httplug脫離guzzle5
鑰匙要點
-
PHP-HTTP的項目
- httplug,允許將任何HTTP客戶端輕鬆注入SDK,為已經使用的HTTP客戶端提供的應用程序提供解決方案,並希望避免使用Guzzle。 > httplug接口軟件包和guzzle 6可以使用作曲家需要php-http/guzzle6-apapter命令。這允許使用Guzzle 6或任何其他實現HTTPLUG的HTTPCLIENT接口的適配器。
- > 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。
- > 注意:您不必熟悉DiffBot SDK的內部邏輯即可進行。本文中的過程適用於具有混凝土HTTP客戶端實現的任何軟件包,並且易於遵循。
- > php-http和httplug PHP-HTTP是PHP中HTTP相關工具的GITHUB組織。它提供HTTPLUG,一個接口的集合和例外,以在PSR-7請求和響應之上定義最小的HTTP客戶端合同。本合同的實現提供 虛擬軟件包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的當前穩定版本:
所有測試都應通過(除了因某些胡說八道而被漏洞且無法混合的測試),因此我們準備開始轉換。
>入門
git clone https://github.com/swader/diffbot-php-client cd diffbot-php-client git checkout tags/0.4.5 composer install phpunit
然後,我們將兩個依賴項添加到我們的composer.json文件中: 這是告訴客戶從現在開始的,這取決於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)。
計劃 > >此外,該項目還具有發現組件,該組件具有一些用於發現已安裝工廠和客戶的靜態類- 這使我們能夠在某些情況下為最終用戶提供零型配置經驗(請參閱文檔)。
>先決條件 讓我們需要其他軟件包:
此更改現在使Diffbot SDK的最終用戶可以:
>安裝了自己的客戶端,讓發現組件與httpmethodsclient同時自動照顧事物,或
大多數用戶將在Autopilot上使用它。 由於EntityFactory發出的投訴,我們實際上不需要編輯API摘要 - 它將自行處理事情。爬網類的呼叫對手有些不同: >這裡的兩個警告 - 使用$響應的JSON方法的第二行,以及期望Guzzle5響應的實體實例化。從這裡開始我們唯一可以影響的線就是前者,所以讓我們將其更改為: 更改為: 實體類別具有以下導入:
>
>由於本教程已經有點長,如果您有興趣學習Guzzle 5和Guzzle 6之間的模擬差異,請參閱相關的功能分支,具體來說是Diffbot SDK的兩個版本之間。 最後,讓我們進行測試: 成功!所有通過(預期跳過測試除外)。 結論 >
guzzle5和php http/httplug之間有什麼區別。 Guzzle5是特定的HTTP客戶端,而PHP HTTP是一個抽象層,可讓您使用任何HTTP客戶端。 HTTPLUG是PHP HTTP的擴展,可提供其他功能。主要區別在於,PHP HTTP和HTTPLUG允許更具靈活性和互操作性,因為它們不與特定的HTTP客戶端綁定。 >如何使用php http/httplug發送請求? git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client
git checkout tags/0.4.5
composer install
phpunit
git checkout -b feature-httplug
"require": {
...
"php-http/client-implementation": "^1.0"
},
"require-dev": {
...
"php-http/guzzle6-adapter": "~0.2@dev"
},
呼叫的結果被保存為$響應,這是一個guzzle5響應。然後,該響應由實體工廠進行處理,該工廠檢查其有效性並從中構建實體,將其推入實體迭代器。
因此,該計劃是:
>
> difbot類git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client
git checkout tags/0.4.5
composer install
phpunit
我們可以將其更改為:
>
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"
api摘要,爬網和搜索
因為我們之前實現的httpmethodsclient實例具有GET方法,因此在這方面不需要更改。但是,$響應實例顯示了一個誤匹配,並且有充分的理由。 EntityFactory預期的原始$響應是Guzzle5響應。git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client
git checkout tags/0.4.5
composer install
phpunit
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"
use GuzzleHttp\Client;
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中是不同的,因此我們的測試需要大修稍大。
$array = json_decode($response->getBody(), true);
>
經常詢問有關php http和httplug
的問題(常見問題解答)
guzzle5和php http/httplug?
php http/httplug PHP的依賴關係管理工具。您可以通過運行命令作曲家需要PHP-HTTP/HTTPLUG來安裝它。這將下載httplug庫及其依賴項。
>
>如何使用php http/httplug?
> httplug中的插件是什麼,我如何使用它們?
插件httplug中的插件用於向HTTP客戶端添加功能。它們可用於添加身份驗證,緩存和錯誤處理之類的功能。可以使用插件類的AddPlugin方法將插件添加到客戶端中。>
>如何處理php http/httplug中的錯誤?以上是用php-http和httplug脫離guzzle5的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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