{"id":25310,"date":"2021-06-04T11:30:00","date_gmt":"2021-06-04T08:30:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=25310"},"modified":"2021-10-17T20:27:31","modified_gmt":"2021-10-17T17:27:31","slug":"kuinka-kayttaa-guzzlea-php-http-asiakas-http-pyyntojen-lahettamiseen","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/fi\/kuinka-kayttaa-guzzlea-php-http-asiakas-http-pyyntojen-lahettamiseen\/","title":{"rendered":"Kuinka k\u00e4ytt\u00e4\u00e4 Guzzlea &#8211; PHP HTTP -asiakas HTTP-pyynt\u00f6jen l\u00e4hett\u00e4miseen"},"content":{"rendered":"<p>Kehitt\u00e4j\u00e4 t\u00f6rm\u00e4\u00e4 aina teht\u00e4v\u00e4\u00e4n, jossa heid\u00e4n on l\u00e4hetett\u00e4v\u00e4 HTTP-pyynn\u00f6t muille resursseille ja k\u00e4sitelt\u00e4v\u00e4 vastausta. Suosittu tapa suorittaa n\u00e4m\u00e4 teht\u00e4v\u00e4t on k\u00e4ytt\u00e4\u00e4 cURL: \u00e4\u00e4. CURL: n k\u00e4ytt\u00f6 ei kuitenkaan ole suhteellisen helppoa aloittelijoille. Palvelimen olisi pit\u00e4nyt ottaa k\u00e4ytt\u00f6\u00f6n cURL-laajennus my\u00f6s kirjoittaaksesi komentosarjan cURL-muodossa.<\/p>\n<p><a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> on vaihtoehto cURL: lle. Se on PHP HTTP -asiakas, joka helpottaa HTTP-pyynt\u00f6jen l\u00e4hett\u00e4mist\u00e4 ja on triviaali integroida verkkopalveluihin. Jopa voin sanoa kokemuksestani, ett\u00e4 Guzzle on parempi kuin CURL. Se on yksinkertainen ja helppo k\u00e4ytt\u00e4\u00e4. Jos k\u00e4yt\u00e4t Guzzlea, sinun ei tarvitse olla CURL-laajennusta palvelimellasi. Se antaa sinulle paremman muotoilun koodiin kuin cURL.<\/p>\n<p>T\u00e4st\u00e4 huolimatta katsotaanpa, miten Guzzlea k\u00e4ytet\u00e4\u00e4n sovelluksessasi.<\/p>\n<h3>Asennus<\/h3>\n<p>Suositeltu tapa asentaa Guzzle on Composer. Jos et ole asentanut Composeria j\u00e4rjestelm\u00e4\u00e4si, saat sen <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4\u00e4lt\u00e4<\/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=\"Kuinka k\u00e4ytt\u00e4\u00e4 Guzzlea - PHP HTTP -asiakas HTTP-pyynt\u00f6jen l\u00e4hett\u00e4miseen\" ><\/a><\/p>\n<p>Avaa p\u00e4\u00e4te projektisi juurihakemistossa ja asenna Guzzle suorittamalla seuraava komento.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Guzzle tukee kaikkia HTTP-pyynt\u00f6j\u00e4, jotka ovat GET, DELETE, HEAD, OPTIONS, PATCH, POST ja PUT. T\u00e4ss\u00e4 opetusohjelmassa tutkitaan, miten Guzzlea k\u00e4ytet\u00e4\u00e4n HTTP-pyynt\u00f6jen l\u00e4hett\u00e4miseen ja vastausten k\u00e4sittelemiseen sen kanssa.<\/p>\n<p>Otan esimerkkin\u00e4 <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REQ | RES-<\/a> palvelun, joka tarjoaa v\u00e4\u00e4rennetyn todellisen API: n HTTP-pyynt\u00f6jen testaamiseen.<\/p>\n<h3>Kuinka l\u00e4hett\u00e4\u00e4 HTTP-pyynt\u00f6 Guzzlen avulla<\/h3>\n<p>Kun asennat Guzzle-kirjaston, sinun on sis\u00e4llytett\u00e4v\u00e4 tiedostoon Guzzle-ymp\u00e4rist\u00f6 seuraavasti.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse GuzzleHttpClient;<\/code><\/pre>\n<p>Yritet\u00e4\u00e4n nyt muutamia toimintoja yksi kerrallaan, kuten GET, POST, File upload, kopioi tiedosto et\u00e4-URL-osoitteesta paikalliseen hakemistoon, PUT, PATCH ja DELETE.<\/p>\n<h4>Hanki pyynt\u00f6 Guzzlen avulla<\/h4>\n<p>Jos katsot REQ | RES-verkkosivustoa, he antoivat muutaman p\u00e4\u00e4tepisteen GET-pyynn\u00f6ille. Otan esimerkin LIST USERS -p\u00e4\u00e4tteest\u00e4. K\u00e4ytt\u00e4j\u00e4luettelon saamiseksi he pyyt\u00e4v\u00e4t l\u00e4hett\u00e4m\u00e4\u00e4n GET-pyynn\u00f6n t\u00e4h\u00e4n p\u00e4\u00e4tepisteeseen <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>Guzzlessa l\u00e4het\u00e4mme t\u00e4m\u00e4n GET-pyynn\u00f6n seuraavasti.<\/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>Ensin puroin &#8217;base_uri&#8217; (yleinen URL) nimell\u00e4 <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in<\/a>. T\u00e4ss\u00e4 lopullinen p\u00e4\u00e4tepiste on &#8217;\/ api \/ users&#8217; ja se vaatii GET-parametrin &#8217;sivuna&#8217;. Guzzlessa voit l\u00e4hett\u00e4\u00e4 GET-parametreja k\u00e4ytt\u00e4m\u00e4ll\u00e4 kyselytaulukkoa yll\u00e4 olevan koodin mukaisesti.<\/p>\n<h4>POST-pyynt\u00f6 Guzzlen avulla<\/h4>\n<p>Normaalisti POST-pyynt\u00f6j\u00e4 on 2 tyyppi\u00e4. Saatat joutua POST-parametreiksi &#8217;application \/ x-www-form-urlencoded&#8217; POST-pyynn\u00f6n\u00e4 tai l\u00e4hett\u00e4m\u00e4\u00e4n JSON-koodatut tiedot pyynn\u00f6n runkona. Voit l\u00e4hett\u00e4\u00e4 JSON-koodattuja tietoja alla olevan kuvan mukaisesti.<\/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>Jos kyseess\u00e4 on &#8217;application \/ x-www-form-urlencoded&#8217; POST-pyynt\u00f6, voit l\u00e4hett\u00e4\u00e4 parametrit seuraavasti.<\/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>Joissakin tapauksissa API-p\u00e4\u00e4tepisteet pyyt\u00e4v\u00e4t sinua l\u00e4hett\u00e4m\u00e4\u00e4n valtuutustunnuksen kuhunkin HTTP-pyynt\u00f6\u00f6n. K\u00e4ytt\u00e4j\u00e4 voi l\u00e4hett\u00e4\u00e4 t\u00e4m\u00e4n tunnuksen otsikoina Guzzle-pyynt\u00f6si yhteydess\u00e4.<\/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>Kopioi tiedosto et\u00e4palvelimesta Guzzlen avulla<\/h4>\n<p>Jos haluat kopioida tiedoston et\u00e4palvelimesta paikalliseen hakemistoon, Guzzle on parempi vaihtoehto. Oletetaan, ett\u00e4 haluat kopioida t\u00e4m\u00e4n kuvan osoitteessa <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> nimell\u00e4 &#8217;blog.jpg&#8217; paikalliseen hakemistoon. Kirjoitamme sille koodin alla olevan kuvan mukaisesti.<\/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>Tiedoston lataus Guzzlella<\/h4>\n<p>Kuten me kaikki tied\u00e4mme, tiedostojen lataamista varten on asetettava pyynn\u00f6n runko &#8217;multipart \/ form-data&#8217; -lomakkeeseen. Tiedostojen lataamista varten Guzzlen peruskoodi kirjoitetaan alla.<\/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>Osoittaakseni tiedoston lataamisen otan reaaliaikaisen esimerkin <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reSmush.it-sovellusliittym\u00e4st\u00e4,<\/a> joka l\u00e4hett\u00e4\u00e4 kuvan optimoidun vastauksen. Sinun on l\u00e4hetett\u00e4v\u00e4 kuvasi heid\u00e4n p\u00e4\u00e4tepisteeseens\u00e4. Sen koodi Guzzlea k\u00e4ytt\u00e4en seuraavasti.<\/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>PUT, PATCH ja DELETE Pyyd\u00e4 Guzzlella<\/h3>\n<p>PUT- ja PATCH-pyynt\u00f6j\u00e4 k\u00e4ytet\u00e4\u00e4n resurssien p\u00e4ivitt\u00e4miseen. N\u00e4m\u00e4 kaksi pyynt\u00f6\u00e4 tekev\u00e4t sen kuitenkin toisin.<\/p>\n<p>PUT korvaa koko kokonaisuuden, jos se on jo olemassa, ja luo uuden resurssin, jos sit\u00e4 ei ole olemassa. Jos haluat p\u00e4ivitt\u00e4\u00e4 henkil\u00f6n nimen, sinun on l\u00e4hetett\u00e4v\u00e4 koko resurssi, kun teet PUT-pyynt\u00f6\u00e4.<\/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>PATCH-pyynt\u00f6 p\u00e4ivitt\u00e4\u00e4 resurssin osittain. Se tarkoittaa, ett\u00e4 sinun on l\u00e4hetett\u00e4v\u00e4 vain p\u00e4ivitett\u00e4v\u00e4t tiedot, eik\u00e4 se vaikuta tai muuta mit\u00e4\u00e4n muuta. Joten jos haluat p\u00e4ivitt\u00e4\u00e4 henkil\u00f6n nimen, sinun on l\u00e4hetett\u00e4v\u00e4 vain nimiparametri.<\/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>DELETE-pyynt\u00f6 on suoraviivainen. Sinun tarvitsee vain osua p\u00e4\u00e4tepisteeseen seuraavasti.<\/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>Toivon, ett\u00e4 sait tiet\u00e4\u00e4 Guzzlesta ja sen k\u00e4yt\u00f6n perusteista. Voit lukea lis\u00e4\u00e4 Guzzlen pyynt\u00f6asetuksista heid\u00e4n <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\/request-options.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentaatiosta<\/a>. Jaa ajatuksesi tai ehdotuksesi alla olevassa kommenttiosassa.<\/p>\n<h4>Aiheeseen liittyv\u00e4t artikkelit<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/youtube-sovellusliittyma-kuinka-saada-luettelo-kanavasi-youtube-videoista\/\" title=\"YouTube-sovellusliittym\u00e4 - Kuinka saada luettelo kanavasi YouTube-videoista\">YouTube-sovellusliittym\u00e4 &#8211; Kuinka saada luettelo kanavasi YouTube-videoista<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/tinypng-pakkaa-kuvat-php-lla\/\" title=\"TinyPNG Pakkaa kuvat PHP: ll\u00e4\">TinyPNG Pakkaa kuvat PHP: ll\u00e4<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/html-muodon-vahvistus-persiljaa-kayttaen\/\" title=\"HTML-muodon vahvistus persiljaa k\u00e4ytt\u00e4en\">HTML-muodon vahvistus persiljaa k\u00e4ytt\u00e4en<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <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 tarjoaa saumattoman tavan l\u00e4hett\u00e4\u00e4 HTTP-pyynt\u00f6 ja k\u00e4sitell\u00e4 vastausta. T\u00e4ss\u00e4 artikkelissa tutkitaan, miten l\u00e4hetet\u00e4\u00e4n HTTP-pyynt\u00f6 ja k\u00e4sittely<\/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":[275],"tags":[843],"class_list":["post-25310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-6","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts\/25310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/comments?post=25310"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts\/25310\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/media\/21661"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/media?parent=25310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/categories?post=25310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/tags?post=25310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}