搜索
首页后端开发php教程用php-http和httplug脱离guzzle5

用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
11个最佳PHP URL缩短脚本(免费和高级)11个最佳PHP URL缩短脚本(免费和高级)Mar 03, 2025 am 10:49 AM

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

Instagram API简介Instagram API简介Mar 02, 2025 am 09:32 AM

在Facebook在2012年通过Facebook备受瞩目的收购之后,Instagram采用了两套API供第三方使用。这些是Instagram Graph API和Instagram Basic Display API。作为开发人员建立一个需要信息的应用程序

在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

宣布 2025 年 PHP 形势调查宣布 2025 年 PHP 形势调查Mar 03, 2025 pm 04:20 PM

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境