{"id":29002,"date":"2021-06-04T11:59:00","date_gmt":"2021-06-04T08:59:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29002"},"modified":"2021-10-18T03:37:23","modified_gmt":"2021-10-18T00:37:23","slug":"jak-korzystac-z-guzzle-klienta-php-http-do-wysylania-zadan-http","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/jak-korzystac-z-guzzle-klienta-php-http-do-wysylania-zadan-http\/","title":{"rendered":"Jak korzysta\u0107 z Guzzle \u2014 klienta PHP HTTP do wysy\u0142ania \u017c\u0105da\u0144 HTTP"},"content":{"rendered":"<p>Deweloper zawsze napotyka zadanie, w kt\u00f3rym musi wysy\u0142a\u0107 \u017c\u0105dania HTTP do innych zasob\u00f3w i obs\u0142ugiwa\u0107 odpowied\u017a. Popularnym sposobem wykonywania tych zada\u0144 jest u\u017cycie cURL. Jednak korzystanie z cURL nie jest stosunkowo \u0142atwe dla pocz\u0105tkuj\u0105cego. Aby napisa\u0107 skrypt w cURL, tw\u00f3j serwer powinien mie\u0107 w\u0142\u0105czone rozszerzenie cURL.<\/p>\n<p><a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> jest alternatyw\u0105 dla cURL. Jest to klient PHP HTTP, kt\u00f3ry u\u0142atwia wysy\u0142anie \u017c\u0105da\u0144 HTTP i trywialny do integracji z us\u0142ugami sieciowymi. Nawet z mojego do\u015bwiadczenia mog\u0119 powiedzie\u0107, \u017ce Guzzle jest lepszy ni\u017c cURL. Jest prosty i \u0142atwy w u\u017cyciu. Je\u015bli u\u017cywasz Guzzle, nie musisz mie\u0107 rozszerzenia cURL na swoim serwerze. Daje lepsze formatowanie kodu w por\u00f3wnaniu do cURL.<\/p>\n<p>Bior\u0105c to pod uwag\u0119, zobaczmy, jak u\u017cywa\u0107 Guzzle w twojej aplikacji.<\/p>\n<h3>Instalacja<\/h3>\n<p>Zalecanym sposobem instalacji Guzzle jest u\u017cycie Kompozytora. Je\u015bli nie zainstalowa\u0142e\u015b Composera w swoim systemie, mo\u017cesz go pobra\u0107 <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">st\u0105d<\/a>.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20348-6081e2b54209f.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20348-6081e2b54209f.png\" alt=\"Jak korzysta\u0107 z Guzzle \u2014 klienta PHP HTTP do wysy\u0142ania \u017c\u0105da\u0144 HTTP\" ><\/a><\/p>\n<p>Otw\u00f3rz terminal w katalogu g\u0142\u00f3wnym projektu i uruchom poni\u017csze polecenie, aby zainstalowa\u0107 Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Guzzle zapewnia obs\u0142ug\u0119 wszystkich \u017c\u0105da\u0144 HTTP, takich jak GET, DELETE, HEAD, OPTIONS, PATCH, POST i PUT. W tym samouczku uczymy si\u0119, jak u\u017cywa\u0107 Guzzle do wysy\u0142ania \u017c\u0105da\u0144 HTTP i obs\u0142ugi za jego pomoc\u0105 odpowiedzi.<\/p>\n<p>Jako przyk\u0142ad bior\u0119 us\u0142ug\u0119 <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REQ|RES<\/a>, kt\u00f3ra zapewnia fa\u0142szywe prawdziwe API do testowania \u017c\u0105da\u0144 HTTP.<\/p>\n<h3>Jak wys\u0142a\u0107 \u017c\u0105danie HTTP za pomoc\u0105 Guzzle<\/h3>\n<p>Po zainstalowaniu biblioteki Guzzle musisz do\u0142\u0105czy\u0107 do swojego pliku \u015brodowisko Guzzle w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse GuzzleHttpClient;<\/code><\/pre>\n<p>Teraz wypr\u00f3bujmy kilka operacji jedna po drugiej, takich jak GET, POST, przesy\u0142anie pliku, skopiuj plik ze zdalnego adresu URL do katalogu lokalnego, PUT, PATCH i DELETE.<\/p>\n<h4>POBIERZ \u017c\u0105danie za pomoc\u0105 Guzzle<\/h4>\n<p>Je\u015bli spojrzysz na stron\u0119 REQ|RES, znajdziesz tam kilka punkt\u00f3w ko\u0144cowych dla \u017c\u0105da\u0144 \u201eGET&quot;. Pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem punktu ko\u0144cowego \u201eLISTA U\u017bYTKOWNIK\u00d3W&#8221;. Aby uzyska\u0107 list\u0119 u\u017cytkownik\u00f3w, prosz\u0105 o wys\u0142anie \u017c\u0105dania GET do tego punktu ko\u0144cowego <a href=\"https:\/\/reqres.in\/api\/users?page=2\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in\/api\/users?page=2<\/a>.<\/p>\n<p>W Guzzle wy\u015blemy to \u017c\u0105danie GET w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/reqres.in',\n]);\n\u00a0\u00a0\n$response = $client-&gt;request('GET', '\/api\/users', [\n\u00a0\u00a0\u00a0\u00a0'query' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'page' =&gt; '2',\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\n\/\/get status code using $response-&gt;getStatusCode();\n\u00a0\n$body = $response-&gt;getBody();\n$arr_body = json_decode($body);\nprint_r($arr_body);<\/code><\/pre>\n<p>Najpierw wyodr\u0119bni\u0142em \u201ebase_uri&#8221; (wsp\u00f3lny adres URL) jako <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in<\/a>. Tutaj ko\u0144cowy punkt ko\u0144cowy to \u201e\/api\/users&#8221; i wymaga parametru GET jako \u201epage&#8221;. W Guzzle mo\u017cesz wysy\u0142a\u0107 parametry GET za pomoc\u0105 tablicy 'query&#8217;, jak pokazano w powy\u017cszym kodzie.<\/p>\n<h4>\u017b\u0105danie POST przy u\u017cyciu Guzzle<\/h4>\n<p>Zwykle istniej\u0105 2 rodzaje \u017c\u0105da\u0144 POST. Mo\u017ce by\u0107 konieczne podanie parametr\u00f3w POST jako \u017c\u0105dania POST \u201eapplication\/x-www-form-urlencoded&#8221; lub przes\u0142anie danych zakodowanych w formacie JSON jako tre\u015bci \u017c\u0105dania. Mo\u017cesz publikowa\u0107 dane zakodowane w formacie JSON, jak pokazano poni\u017cej.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/reqres.in',\n]);\n\u00a0\n$response = $client-&gt;request('POST', '\/api\/users', [\n\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name' =&gt; 'Sam',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'job' =&gt; 'Developer'\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\n\/\/get status code using $response-&gt;getStatusCode();\n\u00a0\n$body = $response-&gt;getBody();\n$arr_body = json_decode($body);\nprint_r($arr_body);<\/code><\/pre>\n<p>W przypadku \u017c\u0105dania POST \u201eapplication\/x-www-form-urlencoded&#8221; parametry POST mo\u017cna wykona\u0107 w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'BASE_URL_ENDPOINT',\n]);\n\u00a0\n$client-&gt;request('POST', '\/endpoint_here', [\n\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'foo' =&gt; 'bar',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'baz' =&gt; ['hi', 'there!']\n\u00a0\u00a0\u00a0]\n]);<\/code><\/pre>\n<p>W niekt\u00f3rych przypadkach punkty ko\u0144cowe interfejsu API prosz\u0105 o przes\u0142anie tokena autoryzacji w ka\u017cdym \u017c\u0105daniu HTTP. U\u017cytkownik mo\u017ce wys\u0142a\u0107 ten token jako nag\u0142\u00f3wki w \u017c\u0105daniu Guzzle.<\/p>\n<pre><code>&lt;?php\n$client-&gt;request('POST', '\/endpoint_here', [\n\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer TOKEN_VALUE\"\n\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'foo' =&gt; 'bar',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'baz' =&gt; ['hi', 'there!']\n\u00a0\u00a0\u00a0\u00a0]\n]);<\/code><\/pre>\n<h4>Skopiuj plik ze zdalnego serwera za pomoc\u0105 Guzzle<\/h4>\n<p>Je\u015bli chcesz skopiowa\u0107 plik ze zdalnego serwera do lokalnego katalogu, Guzzle b\u0119dzie lepszym rozwi\u0105zaniem. Za\u0142\u00f3\u017cmy, \u017ce chcesz skopiowa\u0107 ten obraz ze strony <a href=\"https:\/\/artisansweb.net\/wp-content\/uploads\/2020\/03\/blog.jpg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/artisansweb.net\/wp-content\/uploads\/2020\/03\/blog.jpg<\/a> jako \u201eblog.jpg&#8221; do lokalnego katalogu. Napiszemy dla niego kod, jak pokazano poni\u017cej.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\n$fp = fopen('blog.jpg', 'wb');\n\u00a0\n$client = new GuzzleHttpClient();\n$request = $client-&gt;get('https:\/\/artisansweb.net\/wp-content\/uploads\/2020\/03\/blog.jpg', ['sink' =&gt; $fp]);\n\u00a0\nfclose($fp);<\/code><\/pre>\n<h4>Przesy\u0142anie plik\u00f3w za pomoc\u0105 Guzzle<\/h4>\n<p>Jak wszyscy wiemy, aby przes\u0142a\u0107 pliki, musimy ustawi\u0107 tre\u015b\u0107 \u017c\u0105dania na formularz 'multipart\/form-data&#8217;. Podstawowy kod w Guzzle do przesy\u0142ania plik\u00f3w by\u0142by napisany jak poni\u017cej.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'BASE_URL_HERE',\n]);\n\u00a0\n$client-&gt;request('POST', '\/endpoint_here', [\n\u00a0\u00a0\u00a0\u00a0'multipart' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name'\u00a0\u00a0\u00a0\u00a0 =&gt; 'files', \/\/ name value requires by endpoint\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'contents' =&gt; fopen('\/path\/to\/file', 'r'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'filename' =&gt; 'custom_image.jpg'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0]\n]);<\/code><\/pre>\n<p>Aby zademonstrowa\u0107 przesy\u0142anie pliku, wezm\u0119 przyk\u0142ad na <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u017cywo API reSmush.it,<\/a> kt\u00f3ry w odpowiedzi wysy\u0142a zoptymalizowan\u0105 wersj\u0119 obrazu. Musisz POSTowa\u0107 sw\u00f3j obraz do punktu ko\u0144cowego. Kod do niego przy u\u017cyciu Guzzle w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'http:\/\/api.resmush.it',\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', \"?qlty=92\", [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'multipart' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name'\u00a0\u00a0\u00a0\u00a0 =&gt; 'files', \/\/ name value requires by endpoint\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'contents' =&gt; fopen(getcwd().'\/blog.jpg', 'r'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'filename' =&gt; 'blog.jpg',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'headers'\u00a0 =&gt; array('Content-Type' =&gt; mime_content_type(getcwd().'\/blog.jpg'))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0if (200 == $response-&gt;getStatusCode()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $response-&gt;getBody();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$arr_result = json_decode($response);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print_r($arr_result);\n\u00a0\u00a0\u00a0\u00a0}\n} catch (Exception $e) {\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n}<\/code><\/pre>\n<h3>\u017b\u0105danie PUT, PATCH i DELETE za pomoc\u0105 Guzzle<\/h3>\n<p>\u017b\u0105dania PUT i PATCH s\u0105 u\u017cywane do aktualizacji zasob\u00f3w. Jednak te 2 pro\u015bby robi\u0105 to inaczej.<\/p>\n<p>PUT zast\u0119puje ca\u0142\u0105 jednostk\u0119, je\u015bli ju\u017c istnieje, i tworzy nowy zas\u00f3b, je\u015bli nie istnieje. Je\u015bli chcesz zaktualizowa\u0107 imi\u0119 i nazwisko osoby, podczas sk\u0142adania \u017c\u0105dania PUT musisz przes\u0142a\u0107 ca\u0142y zas\u00f3b.<\/p>\n<pre><code>&lt;?php\n&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/reqres.in',\n]);\n\u00a0\u00a0\n$response = $client-&gt;request('PUT', '\/api\/users\/2', [\n\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name' =&gt; 'Sam',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'job' =&gt; 'Developer'\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\u00a0\n\/\/get status code using $response-&gt;getStatusCode();\n\u00a0\n$body = $response-&gt;getBody();\n$arr_body = json_decode($body);\nprint_r($arr_body);<\/code><\/pre>\n<p>\u017b\u0105danie PATCH stosuje cz\u0119\u015bciow\u0105 aktualizacj\u0119 zasobu. Oznacza to, \u017ce musisz wys\u0142a\u0107 tylko dane, kt\u00f3re chcesz zaktualizowa\u0107, i nie wp\u0142ynie to na nic innego. Je\u015bli wi\u0119c chcesz zaktualizowa\u0107 imi\u0119 i nazwisko osoby, wystarczy przes\u0142a\u0107 parametr name.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/reqres.in',\n]);\n\u00a0\u00a0\n$response = $client-&gt;request('PATCH', '\/api\/users\/2', [\n\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name' =&gt; 'Sam',\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\u00a0\n\/\/get status code using $response-&gt;getStatusCode();\n\u00a0\n$body = $response-&gt;getBody();\n$arr_body = json_decode($body);\nprint_r($arr_body);<\/code><\/pre>\n<p>\u017b\u0105danie DELETE jest proste. Musisz tylko trafi\u0107 w punkt ko\u0144cowy w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\u00a0\nuse GuzzleHttpClient;\n\u00a0\u00a0\n$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/reqres.in',\n]);\n\u00a0\u00a0\n$response = $client-&gt;request('DELETE', '\/api\/users\/2');\n\u00a0\u00a0\necho $response-&gt;getStatusCode(); \/\/should gives 204<\/code><\/pre>\n<p>Mam nadziej\u0119, \u017ce pozna\u0142e\u015b Guzzle i podstawy, jak go u\u017cywa\u0107. Mo\u017cesz przeczyta\u0107 wi\u0119cej o opcjach Guzzle Request w ich <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\/request-options.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji<\/a>. Podziel si\u0119 swoimi przemy\u015bleniami lub sugestiami w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/youtube-api-jak-uzyskac-liste-filmow-z-youtube-na-swoim-kanale\/\" title=\"YouTube API \u2013 jak uzyska\u0107 list\u0119 film\u00f3w z YouTube na swoim kanale\">YouTube API \u2013 jak uzyska\u0107 list\u0119 film\u00f3w z YouTube na swoim kanale<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/tinypng-kompresuj-obrazy-za-pomoca-php\/\" title=\"TinyPNG Kompresuj obrazy za pomoc\u0105 PHP\">TinyPNG Kompresuj obrazy za pomoc\u0105 PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/walidacja-formularza-html-za-pomoca-pietruszki\/\" title=\"Walidacja formularza HTML za pomoc\u0105 pietruszki\">Walidacja formularza HTML za pomoc\u0105 pietruszki<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guzzle zapewnia bezproblemowy spos\u00f3b wysy\u0142ania \u017c\u0105da\u0144 HTTP i obs\u0142ugi odpowiedzi. W tym artykule dowiemy si\u0119, jak wysy\u0142a\u0107 i obs\u0142ugiwa\u0107 \u017c\u0105danie HTTP<\/p>\n","protected":false},"author":1,"featured_media":21661,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[277],"tags":[847],"class_list":["post-29002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-8","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/comments?post=29002"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29002\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/21661"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=29002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=29002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=29002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}