{"id":231767,"date":"2022-12-28T18:56:00","date_gmt":"2022-12-28T15:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231767"},"modified":"2022-12-28T18:59:14","modified_gmt":"2022-12-28T15:59:14","slug":"a-diferenca-em-solicitacoes-curl-e-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/a-diferenca-em-solicitacoes-curl-e-wordpress\/","title":{"rendered":"A diferen\u00e7a em solicita\u00e7\u00f5es cURL e WordPress"},"content":{"rendered":"\n<p><a href=\"https:\/\/curl.haxx.se\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cURL<\/a> \u00e9 uma biblioteca PHP muito popular que eu mencionei em v\u00e1rios posts outros posts (<a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-curl-para-determinar-se-o-url-especificado-e-uma-pagina-valida\/\" title=\"1\">1<\/a> e <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/encontrando-o-destino-de-um-redirecionamento-com-php\/\" title=\"2\">2<\/a>, por exemplo). E \u00e9 um que eu acho que deve ser revisado, explorado e possivelmente usado por qualquer pessoa que trabalhe em PHP (sim, mesmo aqueles que trabalham em WordPress).<\/p>\n<p>Mas por causa das APIs nativas do WordPress, temos um n\u00edvel de abstra\u00e7\u00e3o que nos permite obter muitas das mesmas funcionalidades (se n\u00e3o a mesma funcionalidade).<\/p>\n<p>Especificamente, estou falando de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_safe_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_safe_remote_get<\/a>.<\/p>\n<blockquote><p>\n<a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159653-61e6f9c04b30e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159653-61e6f9c04b30e.png\" alt=\"A diferen\u00e7a em solicita\u00e7\u00f5es cURL e WordPress\"><\/a><\/p>\n<p>Essa fun\u00e7\u00e3o \u00e9 ideal quando a solicita\u00e7\u00e3o HTTP est\u00e1 sendo feita para uma URL arbitr\u00e1ria. A URL \u00e9 validada para evitar redirecionamentos e solicita\u00e7\u00f5es de ataques de falsifica\u00e7\u00e3o.<\/p>\n<\/blockquote>\n<p>Menciono especificamente a variante segura <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desta fun\u00e7\u00e3o<\/a> para a defini\u00e7\u00e3o acima (h\u00e1 outra variante, mas \u00e9 importante tomar precau\u00e7\u00f5es contra URLs arbitr\u00e1rias por motivos de seguran\u00e7a).<\/p>\n<h2>cURL e solicita\u00e7\u00f5es do WordPress<\/h2>\n<p>De qualquer forma, como seria <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-00-get-curl-response-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma fun\u00e7\u00e3o<\/a> se us\u00e1ssemos essa biblioteca cURL?<\/p>\n<pre><code>&lt;?php\n\ntry {\n    $curl = curl_init();\n    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');\n    curl_setopt($curl, CURLOPT_URL, $url);\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);\n    $response = curl_exec($curl);\n\n    if (is_object($response)) {\n        return false;\n    }\n\n    if (false === $response) {\n        throw new Exception(curl_error($curl), curl_errno($curl));\n    }\n\n    curl_close($curl);\n} catch (Exception $e) {\n    trigger_error(\n        sprintf(\n            'Curl failed with error #%d: %s',\n            $e-&gt;getCode(),\n            $e-&gt;getMessage()\n        ),\n        E_USER_ERROR\n    );\n}<\/code><\/pre>\n<p>Resumindo (e isso \u00e9 t\u00edpico para a maioria das solicita\u00e7\u00f5es cURL):<\/p>\n<ul>\n<li>inicialize a biblioteca cURL,<\/li>\n<li><a href=\"https:\/\/curl.haxx.se\/docs\/manpage.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definir op\u00e7\u00f5es<\/a> espec\u00edficas para sua solicita\u00e7\u00e3o (que variam de acordo com a solicita\u00e7\u00e3o),<\/li>\n<li>fa\u00e7a o pedido,<\/li>\n<li>avaliar a resposta<\/li>\n<li>capturar quaisquer exce\u00e7\u00f5es necess\u00e1rias.<\/li>\n<\/ul>\n<p>E ent\u00e3o se us\u00e1ssemos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-01-safe-remote-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a mesma varia\u00e7\u00e3o do c\u00f3digo<\/a> no WordPress?<\/p>\n<pre><code>&lt;?php\n\n$response = wp_safe_remote_get($url);\nif (is_wp_error($response)) {\n    return '';\n}\n$response = $response['body'];<\/code><\/pre>\n<p>Isso \u00e9 muito menor e sem d\u00favida mais f\u00e1cil de ler (pelo menos para aqueles que trabalham no WordPress). Em termos de argumentos, tamb\u00e9m n\u00e3o estou passando nada para a fun\u00e7\u00e3o al\u00e9m da URL.<\/p>\n<p>Se voc\u00ea ler a documenta\u00e7\u00e3o da API vinculada, ver\u00e1 que temos algum controle sobre isso; no entanto, ir\u00e1 variar dependendo de como voc\u00ea precisa se comunicar com um determinado ponto de extremidade.<\/p>\n<p>Al\u00e9m disso, como voc\u00ea lida com o <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_error\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Error<\/a> \u00e9 com voc\u00ea. Retornar uma string vazia raramente \u00e9 a melhor op\u00e7\u00e3o; no entanto, para os prop\u00f3sitos deste exemplo, \u00e9 suficiente. O caso que procuramos principalmente \u00e9 o corpo da resposta e esse \u00e9 o foco do c\u00f3digo.<\/p>\n<h2>Quando usamos um ou outro?<\/h2>\n<p>Quando se trata de trabalhar com solicita\u00e7\u00f5es remotas cURL e WordPress e determinar qual m\u00e9todo usar, costumo seguir esta regra:<\/p>\n<ul>\n<li>Se o que eu preciso pode ser alcan\u00e7ado com uma fun\u00e7\u00e3o de API do WordPress, eu a uso.<\/li>\n<li>Caso contr\u00e1rio, usarei cURL.<\/li>\n<\/ul>\n<p>Eu n\u00e3o posso fornecer uma regra mais s\u00f3lida.<\/p>\n<p>Em vez disso, observe o endpoint que voc\u00ea est\u00e1 comunicando, determine qual n\u00edvel de controle voc\u00ea precisa sobre a solicita\u00e7\u00e3o e tome uma decis\u00e3o sobre como deseja lidar com a resposta.<\/p>\n<p>A partir da\u00ed, voc\u00ea deve ter uma boa ideia de qual biblioteca usar.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As solicita\u00e7\u00f5es remotas do cURL e do WordPress nos permitem muitas das mesmas funcionalidades. Mas precisamos ser capazes de determinar qual op\u00e7\u00e3o \u00e9 a melhor.<\/p>\n","protected":false},"author":1,"featured_media":237087,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806,846],"tags":[1170],"class_list":["post-231767","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231767"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231767\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/237087"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}