Rumah > pembangunan bahagian belakang > tutorial php > Keluarkan dari Guzzle5 dengan php-http dan httplug

Keluarkan dari Guzzle5 dengan php-http dan httplug

Jennifer Aniston
Lepaskan: 2025-02-16 10:04:15
asal
291 orang telah melayarinya

Keluarkan dari Guzzle5 dengan php-http dan httplug

Takeaways Key

    httplug, sebuah projek oleh PHP-HTTP, membolehkan suntikan mudah mana-mana klien HTTP ke dalam SDK, menyediakan penyelesaian untuk aplikasi yang sudah mempunyai klien HTTP pilihan yang digunakan dan ingin mengelakkan menggunakan Guzzle.
  • Pakej Antara Muka Httplug dan Guzzle 6 boleh ditarik bersama menggunakan komposer memerlukan arahan php-http/guzzle6-adapter. Ini membolehkan penggunaan Guzzle 6 atau mana -mana penyesuai lain yang melaksanakan antara muka httpclient httplug.
  • Projek PHP-HTTP bertujuan untuk mendapat sokongan maksimum untuk semua pelanggan HTTP di PHP, termasuk Guzzle 5 dan 6, dan Zend1 dan 2. Ini membolehkan tiada konflik dengan versi klien yang dipasang dan mudah memasang penyesuai yang sesuai. 🎜>
  • DiffBot SDK telah dibuat serasi PSR-7 dan menerima pelaksanaan lain pelanggan HTTP. Ia hanya memerlukan penyesuai yang menghormati antara muka httplug untuk segala -galanya untuk berfungsi dari kotak.
  • HTTPLUG menyediakan pendekatan baru untuk abstrak pelaksanaan klien HTTP dalam aplikasi, yang menawarkan kelanjutan untuk kos satu lapisan abstraksi tambahan.
  • Artikel ini dikaji semula oleh Márk Sági-Kazár dan David Buchmann. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk membuat kandungan SitePoint yang terbaik boleh!

Dalam siri sebelumnya, kami membina pelanggan PHP untuk Diffbot. Pelanggan berfungsi dengan baik dan menggunakan penggunaan yang agak meluas - kami juga mengujinya pada aplikasi langsung untuk memastikan ia sampai setanding - tetapi ia sangat bergantung pada Guzzle 5.


Terdapat dua masalah dengan ini:

Guzzle 6 keluar, dan menyokong PSR 7. Walaupun pengarang Guzzle Tuntutan Guzzle 5 akan disokong untuk masa depan yang dijangka, lebih selamat untuk skeptikal panjang umurnya. Selain itu, sementara PSR 7 mungkin mempunyai kebiasaannya, adalah baik untuk mengikuti PSR jika hanya untuk keserasian dengan projek lain

    Seseorang yang melaksanakan pelanggan kami dalam aplikasi mereka mungkin sudah mempunyai klien HTTP yang dipilih, dan ingin menggunakan mereka dan bukannya menggosok. Kami harus membenarkan suntikan mudah
  1. mana -mana
  2. pelanggan http ke dalam SDK kami.
  3. secara kebetulan, ada projek baru yang membolehkan kita berbuat demikian: httplug.

NOTA: Anda tidak perlu akrab dengan logik dalaman SDK Diffbot untuk diikuti. Proses dalam artikel ini boleh digunakan untuk mana -mana pakej dengan pelaksanaan klien HTTP konkrit dan mudah diikuti. Keluarkan dari Guzzle5 dengan php-http dan httplug

php-http dan httplug php-http adalah organisasi GitHub untuk alat berkaitan HTTP dalam PHP. Ia menyediakan HTTPLUG, koleksi antara muka dan pengecualian untuk menentukan kontrak klien HTTP yang minimum di atas permintaan dan tindak balas PSR-7. Pelaksanaan kontrak ini

menyediakan

pakej maya php-http/pelaksanaan klien.

Ini bermakna seseorang yang menggunakan Guzzle 6 boleh komposer memerlukan php-http/guzzle6-adapter untuk menarik penyesuai, pakej antara muka httplug, dan Guzzle 6 sendiri sebagai kebergantungan penyesuai.

Httplug adalah titik masuk untuk pakej yang boleh diguna semula. Ia adalah abstraksi pelanggan semua pelanggan (seperti penyesuai Guzzle6) berdasarkan. Pelanggan -pelanggan ini kemudian menggunakan pakej / kebergantungan asas mereka - Guzzle 6 dalam kes ini.

jadi, bawah ke atas:

  • Pelanggan HTTP wujud (Guzzle 6)
  • Penyesuai Guzzle 6 dibina dengan httplug sebagai antara muka untuknya, Bungkus Guzzle 6
  • Aplikasi yang perlu membuat panggilan HTTP memerlukan pelanggan, memerlukan antara muka HTTPCLIEN HTTPLUG dan bukannya Guzzle 6 secara langsung
  • Aplikasi kemudian boleh menggunakan Guzzle 6, atau mana -mana penyesuai lain yang melaksanakan antara muka HTTPClient Httplug dan membungkus klien HTTP pihak ketiga

Pelan pasukan adalah untuk akhirnya mendapat sokongan maksimum untuk semua pelanggan HTTP di PHP Land: Guzzle 6, Guzzle 5, Zend2, Zend1, dan lain -lain. Versi pelanggan, dan hanya akan memasukkan penyesuai yang sesuai ke dalam campuran.

Perhatikan bahawa kami menggunakan istilah penyesuai dan klien di sini hampir secara bergantian - penyesuai berdasarkan httplug adalah kedua -duanya. Mereka adalah pembungkus di sekitar pelanggan sedia ada, tetapi digunakan secara langsung sebagai pelanggan sendiri.

Pelan kami dalam jawatan ini adalah untuk menggantikan Guzzle Concrete 5 Ketergantungan Pelanggan PHP DiffBot dengan versi HTTPLUG.

NOTA: Pakej Httplug dan berkaitan adalah perisian Alpha, dan oleh itu tertakluk kepada perubahan. Menukar apa sahaja untuk menggunakannya adalah usaha yang berisiko.

bootstrapping

Seperti biasa, disarankan kami menggunakan Homestead yang lebih baik untuk bootstrap persekitaran kita. Sebaik sahaja kita sudah bersedia, kita boleh mengklon dan menguji versi stabil semasa SDK:

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Perintah terakhir menganggap phpunit dipasang secara global pada persekitaran pembangunan.

semua ujian harus lulus (kecuali untuk dilangkau yang diserang dan tidak dapat dipertahankan kerana beberapa karut), jadi kami bersedia untuk memulakan penukaran.

Bermula

Pertama, kita perlu membuat cawangan baru untuk membangunkan peningkatan ini.

git checkout -b feature-httplug
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kemudian, kami menambah dua kebergantungan ke dalam fail komposer.json kami:

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Apa ini adalah memberitahu pelanggan bahawa mulai sekarang, ia bergantung kepada pakej maya - yang satu ini. Ini bermakna untuk digunakan, aplikasi menggunakan pelanggan DiffBot kami (seperti ini) mesti memilih pelaksanaan pakej ini (salah satu yang disenaraikan di pautan pada pembungkus). Sudah tentu, semasa pembangunan pakej, mustahil untuk menguji dan melihat sama ada semuanya berfungsi tanpa pelaksanaan sebenar, jadi kami menentukan ketergantungan tambahan. Dalam kes tertentu di atas, kami menggunakan "php-http/guzzle6-adapter": "~0.2@dev". Kami memilih versi tertentu semata -mata kerana ia adalah yang terbaru dan tidak ada pelepasan yang stabil.

Nota: Anda mungkin tertanya -tanya mengapa kami menggunakan pendekatan menambah nilai ke dalam komposer.json dan bukannya mengisytiharkan kebergantungan secara interaktif di terminal seperti yang biasanya kita lakukan. Ini kerana melakukan komposer yang memerlukan pada pakej maya akan membuang ralat - pakej tidak benar -benar wujud, itu hanya nama maya, pemegang tempat, jadi komposer akan keliru tanpa mengetahui apa yang harus dipasang. Terdapat masalah yang mencadangkan perubahan ini, tetapi ia tidak mungkin berlaku tidak lama lagi.

Oleh kerana pakej php-http masih dalam perkembangan berat, kita harus menambah dua nilai berikut kepada fail komposer.json kami:

git checkout -b feature-httplug
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini adalah untuk membolehkan pemasangan pakej dev (tidak stabil), tetapi akan lebih suka versi yang stabil jika ia wujud. Jadi daripada mengambil, katakan, phpunit 5.2.x yang sangat tidak stabil, ia akan mengambil 5.0.8 (paling terkini pada masa penulisan), tetapi ia juga akan berjaya jika kita meminta untuk pakej yang tidak ada Siaran yang stabil (seperti Guzzle6-Adapter).

kita juga perlu mengeluarkan kebergantungan pada Guzzle5, jika kita berhasrat untuk memasang Guzzle6. Akhir memerlukan blok kelihatan seperti ini:

	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pelan

Cara SDK kini berfungsi adalah seperti berikut: Dalam kelas DiffBot utama, kami secara pilihan menetapkan HTTPClient. Ini pada masa ini terikat pada pelaksanaan Guzzle di versi 5. Jika tiada contoh klien tersuai ditetapkan, kelas DiffBot secara automatik menggunakan klien lalai.

Pelanggan ini kemudiannya digunakan oleh kaedah panggilan API Abstrak untuk mengeluarkan permintaan GET ke URL yang diberikan. Di samping itu, terdapat kaedah panggilan tersuai dalam kelas API Crawl dan kelas API carian.

Hasil panggilan disimpan sebagai respons $, yang merupakan respons Guzzle5. Tanggapan itu kemudiannya diproses oleh kilang entiti yang memeriksa kesahihannya dan membina entiti daripadanya, mendorong mereka ke dalam entiti Iterator.

pelan itu, oleh itu, kepada:

  1. Ganti diffbot :: SethttpClient dengan kaedah menerima pelaksanaan httplug
  2. Ubah suai kaedah panggilan API Abstrak, Crawl's, dan Carian 'supaya mereka dapat mengeluarkan permintaan GET dengan mana -mana pelaksanaan klien HTTP yang diberikan kepada mereka.
  3. Ubah suai kilang entiti dan entiti Iterator supaya mereka tidak lagi bergantung pada versi Guzzle5 respons, melainkan rakan sejawat PSR-7.

Projek PHP-HTTP mempunyai pakej tambahan, UTILS, yang mengandungi httpmethodsclient. Kelas itu membungkus kilang mesej dan klien HTTP ke dalam satu keseluruhan, menjadikannya lebih mudah untuk menghantar permintaan dengan kata kerja yang biasa digunakan seperti Get, Post, dan lain-lain-dengan itu menterjemahkan sesuatu yang serupa dengan apa yang telah kita setakat ini: $ client-> GET (. ..). Lebih-lebih lagi, ia juga mengembalikan PSR-7 ResponseInterface, yang bermaksud kaedah Getbody akan tersedia kepada kami-yang hanya akan meninggalkan kaedah Tojson yang tidak diletakkan, sesuatu yang boleh kita lakukan dengan mudah.

Selain itu, projek ini mempunyai komponen penemuan, yang menampilkan beberapa kelas statik untuk menemui kilang dan pelanggan yang dipasang-ini membolehkan kami menyediakan pengguna akhir kami dengan pengalaman sifar-konfigurasi dalam beberapa kes (lihat DOCS).

Dengan pelan pertempuran yang dibentangkan, kita boleh memulakan dengan refactoring.

Prasyarat

mari kita memerlukan pakej tambahan:

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
kelas diffbot

Kelas Diffbot mempunyai garis ini di bahagian atas:

git checkout -b feature-httplug
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
kita hanya boleh mengubahnya menjadi:

	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Kaedah SethttpClient harus menyala di IDE sekarang, dengan mengatakan ia hilang beberapa parameter yang diperlukan, iaitu klien untuk digunakan, dan kilang mesej untuk membina contoh permintaan.

Kaedah harus refactored ke:

Sebagai alternatif, kelas penemuan boleh diimport dengan pernyataan penggunaan di bahagian atas kelas.
"prefer-stable": true,
"minimum-stability": "dev"
Salin selepas log masuk
Salin selepas log masuk

Perubahan ini kini membolehkan pengguna akhir SDK diffbot sama ada:

Mempunyai pelanggan mereka sendiri dipasang dan biarkan komponen penemuan sejajar dengan httpmethodsclient menjaga perkara secara automatik, atau
  • Konfigurasikan contoh httpmethodsclient mereka sendiri dengan menyuntik contoh tersuai klien PSR 7 dan kilang mesej ke dalam contoh baru, dan menyuntik
  • yang
  • ke dalam kaedah sethttpclient untuk fleksibiliti penuh
  • Kebanyakan pengguna akan menggunakannya pada autopilot.

API Abstrak, merangkak dan cari

seterusnya, kaedah panggilan.

Oleh kerana contoh httpmethodsclient yang kami lakukan sebelum ini mempunyai kaedah GET, tidak ada perubahan yang diperlukan dalam hal itu. Walau bagaimanapun, contoh tindak balas $ menunjukkan mistmatch, dan dengan alasan yang baik. Sambutan $ asal yang dijangkakan oleh EntityFactory adalah tindak balas Guzzle5. Keluarkan dari Guzzle5 dengan php-http dan httplug

Oleh kerana aduan yang dikeluarkan oleh EntityFactory, kami tidak perlu mengedit API Abstrak - ia akan menjaga perkara sendiri. Rakan panggilan kelas Crawl 'agak berbeza:

git clone https://github.com/swader/diffbot-php-client
cd diffbot-php-client 
git checkout tags/0.4.5 
composer install
phpunit
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dua amaran di sini - baris kedua kaedah yang menggunakan kaedah JSON $ respons, dan Instansiation EntityIterator yang mengharapkan tindak balas Guzzle5. Satu -satunya baris yang kita boleh menjejaskan dari sini adalah bekas, jadi mari kita ubahnya ke:

git checkout -b feature-httplug
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Perubahan yang sama perlu dilakukan dalam kaedah panggilan kelas carian, di mana garis:

	"require": {
        ...
        "php-http/client-implementation": "^1.0"
    },
    "require-dev": {
        ...
        "php-http/guzzle6-adapter": "~0.2@dev"
    },
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

berubah menjadi:

"prefer-stable": true,
"minimum-stability": "dev"
Salin selepas log masuk
Salin selepas log masuk

Kilang Entiti

Kelas EntityFactory mempunyai import berikut di bahagian atas:

    "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"
    },
Salin selepas log masuk

kita boleh mengubahnya menjadi:

composer require "php-http/utils" "php-http/discovery"
Salin selepas log masuk

yang sama perlu dilakukan di antara muka EntityFactory yang melaksanakan kelas EntityFactory.

Perubahan lain adalah serupa dengan apa yang kita lakukan di atas, dalam kelas merangkak. Kami menukar:

use GuzzleHttp\Client;
Salin selepas log masuk
to

use Http\Client\Utils\HttpMethodsClient as Client;
Salin selepas log masuk
di kedua -dua kaedah checkresponseformat dan createappropriateiterator.

entiti iterator

kita menukar:

to
<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>
Salin selepas log masuk

ujian
<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>
Salin selepas log masuk

Mocking, cara utama menguji permintaan HTTP dan panggilan API, berbeza dengan Guzzle 6, jadi ujian kami memerlukan pembaikan sedikit lebih besar.

Oleh kerana tutorial ini sudah sedikit di sisi panjang, sila lihat cawangan ciri yang relevan jika anda berminat untuk mempelajari perbezaan dalam mengejek antara Guzzle 5 dan Guzzle 6 dan, khususnya, antara dua versi SDK Diffbot .

Akhirnya, mari kita jalankan ujian:

kejayaan! Semua lulus (kecuali ujian yang dilangkau).
$array = json_decode($response->getBody(), true);
Salin selepas log masuk

DiffBot SDK kini bukan sahaja serasi PSR-7, tetapi juga menerima pelaksanaan lain pelanggan HTTP. Semua yang diperlukan adalah penyesuai yang menghormati antara muka httplug, dan segala -galanya harus berfungsi dari kotak.

Kesimpulan

Httplug adalah pendekatan baru yang berguna untuk abstrak pelaksanaan klien HTTP dalam aplikasi yang kami bina. Sama ada kami membina pelanggan HTTP sendiri atau menggunakannya dalam aplikasi lain, PHP-HTTP menyediakan dunia baru yang luas untuk harga yang berpatutan dari satu lapisan abstraksi tambahan.

Jika anda ingin membantu dengan menambah lebih banyak pelaksanaan penyesuai, atau hanya dengan mencuba pakej dan memberi maklum balas, pasukan mengalu -alukan semua sumbangan. Hubungi, atau tinggalkan maklum balas anda di bahagian komen di bawah, dan jika anda mendapati tutorial ini menarik, jangan lupa untuk memukul butang seperti itu!

Soalan Lazim (Soalan Lazim) Mengenai PHP HTTP dan HTTPLUG

Apakah perbezaan antara Guzzle5 dan PHP HTTP/HTTPLUG? Guzzle5 adalah pelanggan HTTP tertentu, manakala PHP HTTP adalah lapisan abstraksi yang membolehkan anda menggunakan mana -mana pelanggan HTTP. HTTPLUG adalah lanjutan PHP HTTP yang menyediakan ciri tambahan. Perbezaan utama adalah bahawa php http dan httplug membolehkan lebih banyak fleksibiliti dan interoperabilitas, kerana ia tidak terikat dengan klien HTTP tertentu. > Migrasi dari Guzzle5 ke PHP HTTP/HTTPLUG melibatkan menggantikan klien Guzzle5 dengan penyesuai yang melaksanakan antara muka HTTP PHP. Ini boleh dilakukan menggunakan Perpustakaan HttPlug, yang menyediakan penyesuai untuk pelbagai pelanggan HTTP, termasuk Guzzle5. Sebaik sahaja penyesuai disediakan, anda boleh menggunakan kaedah HTTP PHP untuk menghantar permintaan dan mengendalikan respons. Menggunakan php http/httplug ke atas Guzzle5 adalah peningkatan fleksibiliti dan interoperabilitas. Dengan PHP HTTP/HTTPLUG, anda boleh menukar antara pelanggan HTTP yang berbeza tanpa menukar kod anda. Ini menjadikannya lebih mudah untuk menguji aplikasi anda dengan pelanggan yang berbeza dan menukar pelanggan jika perlu. Di samping itu, httplug menyediakan sistem plugin yang membolehkan anda menambah fungsi ke klien http anda.

Bagaimana saya memasang php http/httplug? Alat Pengurusan Ketergantungan untuk PHP. Anda boleh memasangnya dengan menjalankan komposer perintah memerlukan php-http/httplug. Ini akan memuat turun perpustakaan httplug dan kebergantungannya.

Bagaimana saya menggunakan php http/httplug untuk menghantar permintaan? objek permintaan. Ini boleh dilakukan dengan menggunakan kaedah Createrequest antara muka MessageFactory. Sebaik sahaja anda mempunyai objek permintaan, anda boleh menghantarnya menggunakan kaedah SendRequest antara muka httpclient.

Bagaimana saya mengendalikan respons dengan php http/httplug? diwakili oleh antara muka ResponseInterface. Anda boleh mengakses kod status, tajuk, dan badan respons menggunakan kaedah getStatuscode, getHeaders, dan getbody. 🎜> Komponen penemuan dalam PHP HTTP/HTTPLUG digunakan untuk mencari dan menggunakan penyesuai HTTP dan kilang mesej secara automatik. Ini menjadikannya lebih mudah untuk beralih antara pelanggan HTTP yang berbeza dan menggunakan pelaksanaan terbaik yang tersedia. Memanggil kaedah mencari statik pada kelas HttpClientDiscovery atau MessageFactoryDiscovery. Ini akan mengembalikan contoh klien atau kilang mesej HTTP yang pertama.

Apakah plugin dalam httplug dan bagaimana saya menggunakannya? Mereka boleh digunakan untuk menambah ciri -ciri seperti pengesahan, caching, dan pengendalian ralat. Plugin boleh ditambah kepada pelanggan menggunakan kaedah addPlugin kelas pluginclient.

Bagaimana saya mengendalikan ralat dalam php http/httplug? Melaksanakan antara muka HttpClientException. Anda boleh menangkap pengecualian ini dan mengendalikannya seperti yang diperlukan. Di samping itu, anda boleh menggunakan errorPlugin untuk menukar respons bukan 200 ke dalam pengecualian secara automatik.

Atas ialah kandungan terperinci Keluarkan dari Guzzle5 dengan php-http dan httplug. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan