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

用php-http和httplug脱离guzzle5

Jennifer Aniston
发布: 2025-02-16 10:04:15
原创
291 人浏览过

用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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板