ホームページ >バックエンド開発 >PHPチュートリアル >php-httpとhttplugでguzzle5から解放されます

php-httpとhttplugでguzzle5から解放されます

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-16 10:04:15312ブラウズ

php-httpとhttplugでguzzle5から解放されます

キーテイクアウト

    PHP-HTTPによるプロジェクトであるHttPlugは、あらゆるHTTPクライアントをSDKに簡単に注入できるようになり、既に使用されているHTTPクライアントが既に使用されていて、ガズルの使用を避けたいアプリケーションのソリューションを提供します。
  • httplugインターフェイスパッケージとGuzzle 6を一緒に引き込むことができます。これにより、httplugのhttpclientインターフェイスを実装するGuzzle 6またはその他のアダプターを使用できます。
  • PHP-HTTPプロジェクトは、Guzzle 5および6、およびZend1と2を含むPHPのすべてのHTTPクライアントを最大限にサポートすることを目的としています。 🎜>
  • diffbot SDKは、HTTPクライアントの他の実装とPSR-7の互換性と受容性になりました。すべてが箱から出して作業するために、HTTPLUGインターフェイスを尊重するアダプターのみが必要です。
  • httplugは、アプリでHTTPクライアントの実装を抽象化するための新しいアプローチを提供し、抽象化の1つの追加レイヤーのコストの拡張性を提供します。
  • この記事は、MárkSági-KazárとDavid Buchmannによってピアレビューされました。 SetePointコンテンツを最高にするためにSitePointのピアレビュアーのすべてに感謝します!
  • 以前のシリーズでは、diffbot用のPHPクライアントを構築しました。クライアントはうまく機能し、比較的広く使用されています。ライブアプリでテストして、標準に達していることを確認しましたが、Guzzle 5に大きく依存します。 これには2つの問題があります:
Guzzle 6が外出しており、PSR 7をサポートしています。Guzzleの著者は、Guzzle 5が近い将来にサポートされると主張していますが、その寿命に懐疑的である方が安全です。その上、PSR 7には癖があるかもしれませんが、他のプロジェクトとの互換性のためだけにPSRをフォローするのは良いことです

アプリにクライアントを実装している人は、すでに好ましいHTTPクライアントを使用している可能性があり、Guzzleではなく使用したいと考えています。 SDKへのhttpクライアントを簡単に注入できるようにする必要があります。


偶然にも、それを行うことができる新しいプロジェクトがあります:httplug。

  1. 注:フォローするDiffbot SDKの内部ロジックに精通する必要はありません。この記事のプロセスは、具体的なHTTPクライアントの実装を備えた任意のパッケージに適用でき、簡単に従うことができます。
  2. php-httpおよびhttplug
  3. PHP-HTTPは、PHPのHTTP関連ツールのGitHub組織です。 PSR-7リクエストと応答に加えて最小限のHTTPクライアント契約を定義するためのインターフェイスと例外のコレクションであるHTTPlugを提供します。この契約の実装は、仮想パッケージのphp-http/client-implementationを提供しますこれは、Guzzle 6を使用する人が作曲家を使用している人が、Adapterの依存関係として、Adapter、Httplug Interfaceパッケージ、およびGuzzle 6自体を引き込むためにphp-http/guzzle6-adapterを必要とすることを意味します。

    httplugは、再利用可能なパッケージのエントリポイントです。これは、すべてのクライアント(guzzle6アダプターなど)が基づいているクライアントの抽象化です。これらのクライアントはさらに、基礎となるパッケージ /依存関係をさらに利用します - この場合はguzzle 6。

    だから、下から上:

    HTTPクライアントが存在します(Guzzle 6)

      Guzzle 6アダプターは、インターフェイスとしてHTTPlugを使用して構築されています。Guzzle6
    • をラップします。
    • http呼び出しを必要とする必要があるアプリは、クライアントを必要とし、httplugのhttpclientインターフェイスが必要です。
    • アプリは、Guzzle 6、またはhttplugのhttpclientインターフェイスを実装し、別のサードパーティのhttpクライアントをラッピングする他のアダプターを使用できます
    • チームの計画は、最終的にPHPランドのすべてのさまざまなHTTPクライアントを最大限にサポートすることです:Guzzle 6、Guzzle 5、Zend2、Zend1など。クライアントバージョン、そして適切なアダプターをミックスに接続するだけです。
    • adapter
    and

    クライアント

    という用語を使用することに注意してください。ここでは、Httplugに基づくアダプターは両方です。彼らは既存のクライアントを中心にラッパーですが、クライアント自身として直接使用されています。 この投稿の計画は、DiffbotのPHPクライアントのコンクリートガズル5依存関係をHTTPlugバージョンに置き換えることです。

    注:httplugおよび関連パッケージはアルファソフトウェアであるため、変更される場合があります。それらを使用するために何でも変換することは、危険な努力です ブートストラップ いつものように、環境をブートストラップするために改善されたHomesteadを使用することをお勧めします。準備ができたら、SDKの現在の安定したバージョンをクローンしてテストできます。

    最後のコマンドは、phpunitが開発環境にグローバルにインストールされていると想定しています。 すべてのテストに合格するはずです(ナンセンスのために盗聴されていないスキップされたテストを除く)。したがって、変換を開始する準備ができています。

    始めましょう

    最初に、このアップグレードを開発するための新しいブランチを作成する必要があります。

    次に、Composer.jsonファイルに2つの依存関係を追加します:

    git clone https://github.com/swader/diffbot-php-client
    cd diffbot-php-client 
    git checkout tags/0.4.5 
    composer install
    phpunit
    
    これが行うことは、これがクライアントに、これからは

    仮想パッケージ - これに依存することを伝えます。これは、使用するために、Diffbotクライアント(このような)を使用するアプリケーション(このパッケージの実装(Packagistのリンクにリストされているものの1つ)を選択する必要があることを意味します。もちろん、パッケージの開発中に、実際の実装なしですべてが機能しているかどうかをテストして確認することは不可能であるため、追加の要件依存関係を指定します。上記の特定のケースでは、「php-http/guzzle6-adapter」:「〜0.2@dev」を使用します。単に最新のものであり、安定したリリースがないという理由だけで、その特定のバージョンを選択しました。

    注:通常のようにターミナルで依存関係をインタラクティブに宣言するのではなく、なぜcomposer.jsonに値を追加するアプローチを使用したのか疑問に思うかもしれません。これは、作曲家が仮想パッケージで要求することでエラーがスローされるためです。パッケージは実際には存在せず、仮想名、プレースホルダーだけなので、作曲家はインストールを知らずに混乱します。これへの変更を示唆する問題がありますが、すぐに起こることはありません。

    php-httpパッケージはまだ激しい開発中であるため、次の2つの値をcomposer.jsonファイルに追加する必要があります。 これは、開発パッケージ(安定)のインストールを許可することですが、存在する場合は安定したバージョンを好みます。したがって、非常に不安定なPHPunit 5.2.xをフェッチするのではなく、5.0.8(執筆時点で最も最新)を取得しますが、持っていないパッケージを尋ねると成功します。安定したリリース(guzzle6-adapterなど)。

    また、guzzle6をインストールする場合は、guzzle5への依存性を削除する必要があります。最終的な要求ブロックは次のようになります:

    git checkout -b feature-httplug
    
    プラン

    SDKが現在機能する方法は次のとおりです。メインのDiffbotクラスでは、オプションでHTTPClientを設定します。これは現在、バージョン5でのGuzzleの実装にバインドされています。カスタムクライアントインスタンスが設定されていない場合、Diffbotクラスはデフォルトのクライアントを自動的に使用します。 このクライアントは、API Abstractの呼び出しメソッドで使用され、指定されたURLにGETリクエストを発行します。さらに、Crawl APIクラスと検索APIクラスにカスタムコールメソッドがあります。

    コールの結果は、$応答として保存されます。これはguzzle5応答です。その応答は、その有効性をチェックし、そこからエンティティを構築するエンティティファクトリーによってさらに処理され、エンティティイテレーターにプッシュされます。 したがって、計画は

    です
    1. diffbot :: sethttpclientをhttplug実装を受け入れるメソッドに置き換えます
    2. API要約、クロール、および検索クラスのコールメソッドを変更して、提供されたHTTPクライアントの実装でGETリクエストを発行できるようにします。
    3. エンティティファクトリーとエンティティのイテレーターを変更して、それらがもはやguzzle5バージョンの応答に依存せず、むしろPSR-7カウンターパートに依存します。
    4. PHP-HTTPプロジェクトには、httpmethodsclientを含む追加のパッケージ、utilsがあります。そのクラスは、メッセージファクトリーとHTTPクライアントを1つの全体に包み、Get、投稿などの一般的に使用される動詞でリクエストを簡単に送信できます。 ..)。さらに、PSR-7 ResponseInterfaceも返します。つまり、GetBodyメソッドが利用可能になります。これは、Tojsonメソッドのみが実装されていないことを意味します。
    さらに、このプロジェクトには発見コンポーネントがあり、インストールされた工場やクライアントを発見するための静的クラスをいくつか備えています。これにより、場合によってはエンドユーザーにゼロコンフィグレーターエクスペリエンスを提供できます(ドキュメントを参照)。

    バトルプランがレイアウトされていると、リファクタリングを始めることができます。

    前提条件

    追加のパッケージが必要です:

    diffbot class

    diffbotクラスには、上部にこの行があります:
    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
    

    または、発見クラスは、クラスの上部にある使用ステートメントを使用してインポートできます。

    この変更により、Diffbot SDKのエンドユーザーが次のようになりました。
    	"require": {
            ...
            "php-http/client-implementation": "^1.0"
        },
        "require-dev": {
            ...
            "php-http/guzzle6-adapter": "~0.2@dev"
        },
    

    独自のクライアントをインストールし、httpmethodsclientと並行してディスカバリーコンポーネントを自動的に処理させます。 を完全な柔軟性のためにsethttpclientメソッドに注入します

    "prefer-stable": true,
    "minimum-stability": "dev"
    
    ほとんどのユーザーはこれをAutoPilotで使用します

    api要約、クロール、検索

    次に、通話方法。

    • 以前に実装したhttpmethodsclientインスタンスには、getメソッドがあるため、その点で変更は必要ありません。ただし、$ ResponseインスタンスはMistMatchを示しており、正当な理由があります。 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
      
      ここでの2つの警告 - $応答のJSONメソッドを使用するメソッドの2行目と、guzzle5応答を期待するエンティティテーターインスタンス化。ここから影響を与えることができる唯一の線は前者ですので、それを変更してみましょう:

      git checkout -b feature-httplug
      
      同様の変更を検索クラスの通話方法で行う必要があります。

      の変更:
      	"require": {
              ...
              "php-http/client-implementation": "^1.0"
          },
          "require-dev": {
              ...
              "php-http/guzzle6-adapter": "~0.2@dev"
          },
      

      Entity Factory
      "prefer-stable": true,
      "minimum-stability": "dev"
      

      EntityFactoryクラスには、上部に次のインポートがあります。

      これを次のように変更できます

          "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;
      
      CheckResponseFormatとcreateApSofsteritoratorメソッドの両方で。

      entity iterator
      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>
      テスト

      HTTPリクエストとAPI呼び出しをテストする主な方法であるモッキングは、Guzzle 6では異なるため、テストにはわずかに大きなオーバーホールが必要です。 このチュートリアルはすでに少し長いので、Guzzle 5とGuzzle 6、特にDiffbot SDKの2つのバージョン間のモッキングの違いを学ぶことに興味がある場合は、関連する機能ブランチをご覧ください。 。

      <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>
      最後に、テストを実行しましょう:

      成功!すべての合格(予想されるスキップテストを除く)。

      diffbot SDKは、PSR-7互換性だけでなく、HTTPクライアントの他の実装を受容的にしています。必要なのは、httplugインターフェイスを尊重するアダプターだけで、すべてが箱から出して作業する必要があります。

      結論

      HTTPLUGは、ビルドするアプリでHTTPクライアントの実装を抽象化するための便利な新しいアプローチです。 HTTPクライアントを自分で構築している場合でも、他のアプリでそれらを使用している場合でも、PHP-HTTPは、抽象化の1つのレイヤーのリーズナブルな価格の拡張性のまったく新しい世界を提供します。
      $array = json_decode($response->getBody(), true);
      
      アダプターの実装を追加するか、パッケージを試してフィードバックを提供するだけで支援したい場合は、チームはすべての貢献を歓迎します。連絡を取るか、以下のコメントセクションにフィードバックを残してください。このチュートリアルが興味深いと感じた場合は、ボタンのようにヒットすることを忘れないでください!

      PHP HTTPおよびHTTPLUG

      に関するよくある質問(FAQ)

      guzzle5とphp http/httplugの違いは何ですか。 Guzzle5は特定のHTTPクライアントであり、PHP HTTPは任意のHTTPクライアントを使用できる抽象化レイヤーです。 HTTPlugは、追加機能を提供するPHP HTTPの拡張機能です。主な違いは、PHP HTTPとHTTPLUGが特定のHTTPクライアントに結び付けられていないため、より柔軟性と相互運用性を可能にすることです。 > Guzzle5からPHP HTTP/HTTPLUGに移行するには、Guzzle5クライアントをPHP HTTPインターフェイスを実装するアダプターに置き換えることが含まれます。これは、guzzle5を含むさまざまなHTTPクライアントにアダプターを提供するHTTPlugライブラリを使用して実行できます。アダプターがセットアップされたら、PHP HTTPメソッドを使用してリクエストを送信し、応答を処理できます。 guzzle5でphp http/httplugを使用すると、柔軟性と相互運用性が向上します。 PHP HTTP/HTTPLUGを使用すると、コードを変更せずに異なるHTTPクライアントを切り替えることができます。これにより、さまざまなクライアントでアプリケーションをテストし、必要に応じてクライアントを切り替えることが容易になります。さらに、HTTPlugは、HTTPクライアントに機能を追加できるプラグインシステムを提供します。 PHPの依存関係管理ツール。コマンドコンポーザーを実行して、php-http/httplugを実行することでインストールできます。これにより、httplugライブラリとその依存関係がダウンロードされます。

      php http/httplugを使用してリクエストを送信するにはどうすればよいですか?

      php http/httplugでリクエストを送信するには、最初に作成する必要があります。リクエストオブジェクト。これは、MessageFactoryインターフェイスのCreaterequestメソッドを使用して実行できます。リクエストオブジェクトを取得したら、HTTPCLIENTインターフェイスのSendRequestメソッドを使用して送信できます。 ResponseInterfaceインターフェイスで表されます。 getStatusCode、getheaders、およびgetBodyメソッドを使用して、応答のステータスコード、ヘッダー、および本文にそれぞれアクセスできます。 php http/httplugのディスカバリーコンポーネントは、利用可能なHTTPアダプターとメッセージ工場を自動的に見つけて使用するために使用されます。これにより、異なるHTTPクライアントを切り替え、利用可能な最良の実装を使用しやすくなります。 httpclientdiscoveryまたはmessagefactorydiscoveryクラスの静的検索メソッドを呼び出します。これにより、最初に利用可能なHTTPクライアントまたはメッセージファクトリーのインスタンスが返されます。

      httplugのプラグインは何ですか?httplugのプラグインを使用して、httpクライアントに機能を追加するために使用します。これらは、認証、キャッシュ、エラー処理などの機能を追加するために使用できます。プラグインコンツクラスのAddPluginメソッドを使用してプラグインをクライアントに追加できます。 httpclientexceptionインターフェイスを実装します。これらの例外をキャッチし、必要に応じてそれらを処理できます。さらに、ErrorPluginを使用して、非200の応答を自動的に例外に変換できます。

以上がphp-httpとhttplugでguzzle5から解放されますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。