{"id":28221,"date":"2021-06-04T12:11:00","date_gmt":"2021-06-04T09:11:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28221"},"modified":"2021-10-18T04:04:43","modified_gmt":"2021-10-18T01:04:43","slug":"como-usar-o-guzzle-um-cliente-php-http-para-enviar-solicitacoes-http","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/como-usar-o-guzzle-um-cliente-php-http-para-enviar-solicitacoes-http\/","title":{"rendered":"Como usar o Guzzle &#8211; um cliente PHP HTTP para enviar solicita\u00e7\u00f5es HTTP"},"content":{"rendered":"<p>O desenvolvedor sempre se depara com uma tarefa em que precisa enviar solicita\u00e7\u00f5es HTTP para outros recursos e lidar com a resposta. A maneira mais comum de realizar essas tarefas \u00e9 usando um cURL. No entanto, usar o cURL n\u00e3o \u00e9 relativamente f\u00e1cil para um iniciante. Al\u00e9m disso, para escrever um script em cURL, seu servidor deve ter habilitado a extens\u00e3o cURL.<\/p>\n<p><a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> \u00e9 uma alternativa ao cURL. \u00c9 um cliente PHP HTTP que facilita o envio de solicita\u00e7\u00f5es HTTP e facilita a integra\u00e7\u00e3o com servi\u00e7os da web. Mesmo, posso dizer por experi\u00eancia pr\u00f3pria, Guzzle \u00e9 melhor do que cURL. \u00c9 simples e f\u00e1cil de usar. Se voc\u00ea estiver usando o Guzzle, n\u00e3o precisa ter a extens\u00e3o cURL em seu servidor. Oferece uma melhor formata\u00e7\u00e3o de c\u00f3digo em compara\u00e7\u00e3o com cURL.<\/p>\n<p>Dito isso, vamos ver como usar o Guzzle em seu aplicativo.<\/p>\n<h3>Instala\u00e7\u00e3o<\/h3>\n<p>A maneira recomendada de instalar o Guzzle \u00e9 por meio do Composer. Se voc\u00ea n\u00e3o instalou o Composer em seu sistema, pode obt\u00ea-lo <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqui<\/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=\"Como usar o Guzzle - um cliente PHP HTTP para enviar solicita\u00e7\u00f5es HTTP\" ><\/a><\/p>\n<p>Abra o terminal no diret\u00f3rio raiz do seu projeto e execute o comando abaixo para instalar o Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>O Guzzle fornece suporte para todas as solicita\u00e7\u00f5es HTTP que s\u00e3o GET, DELETE, HEAD, OPTIONS, PATCH, POST e PUT. Neste tutorial, estudamos como usar o Guzzle para enviar solicita\u00e7\u00f5es HTTP e lidar com as respostas com ele.<\/p>\n<p>Como exemplo, tomo o servi\u00e7o <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REQ | RES<\/a>, que fornece uma API real falsa para testar solicita\u00e7\u00f5es HTTP.<\/p>\n<h3>Como enviar uma solicita\u00e7\u00e3o HTTP usando o Guzzle<\/h3>\n<p>Ap\u00f3s a instala\u00e7\u00e3o da biblioteca Guzzle, voc\u00ea precisa incluir um ambiente Guzzle em seu arquivo da seguinte maneira.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse GuzzleHttpClient;<\/code><\/pre>\n<p>Agora vamos tentar algumas opera\u00e7\u00f5es, uma a uma, como GET, POST, upload de arquivo, copiar arquivo de URL remota para um diret\u00f3rio local, PUT, PATCH e DELETE.<\/p>\n<h4>Solicita\u00e7\u00e3o GET usando Guzzle<\/h4>\n<p>Se voc\u00ea olhar o site REQ | RES, eles forneceram alguns endpoints para solicita\u00e7\u00f5es &#8216;GET&#8217;. Vou pegar o exemplo de ponto de extremidade &#8216;LISTAR USU\u00c1RIOS&#8217;. Para obter a lista de usu\u00e1rios, eles pedem para enviar uma solicita\u00e7\u00e3o GET para este endpoint <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>No Guzzle, enviaremos este pedido GET da seguinte forma.<\/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>Primeiro extra\u00ed um &#8216;base_uri&#8217; (URL comum) como <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in<\/a>. Aqui, o endpoint final \u00e9 &#8216;\/ api \/ users&#8217; e requer um par\u00e2metro GET como &#8216;page&#8217;. No Guzzle, voc\u00ea pode enviar par\u00e2metros GET usando o array &#8216;query&#8217; conforme mostrado no c\u00f3digo acima.<\/p>\n<h4>Solicita\u00e7\u00e3o POST usando Guzzle<\/h4>\n<p>Normalmente, existem 2 tipos de solicita\u00e7\u00f5es POST. Pode ser necess\u00e1rio POSTar par\u00e2metros como solicita\u00e7\u00e3o POST &#8216;application \/ x-www-form-urlencoded&#8217; ou fazer upload de dados codificados em JSON como um corpo da solicita\u00e7\u00e3o. Voc\u00ea pode postar dados codificados em JSON conforme mostrado abaixo.<\/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>No caso da solicita\u00e7\u00e3o POST &#8216;application \/ x-www-form-urlencoded&#8217;, voc\u00ea pode POSTar os par\u00e2metros da seguinte maneira.<\/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>Em alguns casos, os endpoints da API pedem que voc\u00ea envie um token de autoriza\u00e7\u00e3o em cada solicita\u00e7\u00e3o HTTP. O usu\u00e1rio pode enviar este token como cabe\u00e7alhos em sua solicita\u00e7\u00e3o 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>Copiar arquivo do servidor remoto usando Guzzle<\/h4>\n<p>Se voc\u00ea deseja copiar um arquivo de um servidor remoto para o diret\u00f3rio local, o Guzzle ser\u00e1 uma op\u00e7\u00e3o melhor. Digamos que voc\u00ea queira copiar esta imagem em <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> como &#8216;blog.jpg&#8217; para seu diret\u00f3rio local. Vamos escrever o c\u00f3digo para ele conforme mostrado abaixo.<\/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>Upload de arquivo usando Guzzle<\/h4>\n<p>Como todos sabemos, para enviar arquivos, precisamos definir o corpo da solicita\u00e7\u00e3o como um formul\u00e1rio &#8216;multipart \/ form-data&#8217;. O c\u00f3digo b\u00e1sico no Guzzle para upload de arquivos seria escrito como abaixo.<\/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>Para demonstrar o upload do arquivo, <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pegarei<\/a> um exemplo ao vivo da <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API reSmush.it<\/a> que envia uma vers\u00e3o otimizada da imagem em resposta. Voc\u00ea precisa POSTAR sua imagem em seu endpoint. O c\u00f3digo para ele usando Guzzle da seguinte maneira.<\/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 e DELETE Request using Guzzle<\/h3>\n<p>As solicita\u00e7\u00f5es PUT e PATCH s\u00e3o usadas para atualizar os recursos. No entanto, essas 2 solicita\u00e7\u00f5es fazem isso de maneira diferente.<\/p>\n<p>PUT sobrescreve toda a entidade, se ela j\u00e1 existir, e cria um novo recurso, se ainda n\u00e3o existir. Se voc\u00ea deseja atualizar o nome de uma pessoa, voc\u00ea precisa enviar todo o recurso ao fazer uma solicita\u00e7\u00e3o PUT.<\/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>A solicita\u00e7\u00e3o PATCH aplica uma atualiza\u00e7\u00e3o parcial ao recurso. Isso significa que voc\u00ea s\u00f3 precisa enviar os dados que deseja atualizar e n\u00e3o afetar\u00e1 ou alterar\u00e1 mais nada. Portanto, se voc\u00ea deseja atualizar o nome de uma pessoa, ser\u00e1 necess\u00e1rio apenas enviar o par\u00e2metro 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>Uma solicita\u00e7\u00e3o DELETE \u00e9 direta. Voc\u00ea s\u00f3 precisa atingir o ponto de extremidade da seguinte maneira.<\/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>Espero que voc\u00ea conhe\u00e7a o Guzzle e os princ\u00edpios b\u00e1sicos de como us\u00e1-lo. Voc\u00ea pode ler mais sobre Guzzle Request Options em sua <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\/request-options.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o<\/a>. Por favor, compartilhe suas id\u00e9ias ou sugest\u00f5es na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/p>\n<h4>Artigos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/api-do-youtube-como-obter-uma-lista-de-videos-do-youtube-de-seu-canal\/\" title=\"API do YouTube - Como obter uma lista de v\u00eddeos do YouTube do seu canal\">API do YouTube &#8211; Como obter uma lista de v\u00eddeos do YouTube do seu canal<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/tinypng-compactar-imagens-usando-php\/\" title=\"TinyPNG compactar imagens usando PHP\">TinyPNG compactar imagens usando PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/validacao-de-formulario-html-usando-o-parsley\/\" title=\"Valida\u00e7\u00e3o de formul\u00e1rio HTML usando o Parsley\">Valida\u00e7\u00e3o de formul\u00e1rio HTML usando o Parsley<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O Guzzle fornece uma maneira perfeita de enviar solicita\u00e7\u00f5es HTTP e lidar com a resposta. Neste artigo, estudamos como enviar solicita\u00e7\u00e3o HTTP e lidar com<\/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":[278],"tags":[848],"class_list":["post-28221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-9","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/comments?post=28221"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/21661"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=28221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=28221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=28221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}