{"id":231381,"date":"2022-12-28T18:39:00","date_gmt":"2022-12-28T15:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231381"},"modified":"2022-12-28T18:40:51","modified_gmt":"2022-12-28T15:40:51","slug":"la-diferencia-en-las-solicitudes-curl-y-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/la-diferencia-en-las-solicitudes-curl-y-wordpress\/","title":{"rendered":"La diferencia en las solicitudes cURL y WordPress"},"content":{"rendered":"\n<p><a href=\"https:\/\/curl.haxx.se\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cURL<\/a> es una biblioteca PHP muy popular a la que he hecho referencia en varias publicaciones (<a href=\"https:\/\/wordpress.mediadoma.com\/es\/uso-de-curl-para-determinar-si-la-url-especificada-es-una-pagina-valida\/\" title=\"1\">1<\/a> y <a href=\"https:\/\/wordpress.mediadoma.com\/es\/encontrar-el-destino-de-una-redireccion-con-php\/\" title=\"2\">2<\/a>, por ejemplo). Y es uno que creo que deber\u00eda ser revisado, explorado y posiblemente utilizado por cualquiera que trabaje en PHP (s\u00ed, incluso aquellos que trabajan en WordPress).<\/p>\n<p>Pero debido a las API nativas de WordPress, tenemos un nivel de abstracci\u00f3n que nos permite lograr gran parte de la misma funcionalidad (si no la misma funcionalidad).<\/p>\n<p>Espec\u00edficamente, estoy hablando 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=\"La diferencia en las solicitudes cURL y WordPress\"><\/a><\/p>\n<p>Esta funci\u00f3n es ideal cuando la solicitud HTTP se realiza a una URL arbitraria. La URL se valida para evitar redirecci\u00f3n y solicitar ataques de falsificaci\u00f3n.<\/p>\n<\/blockquote>\n<p>Menciono espec\u00edficamente la variante segura de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta funci\u00f3n<\/a> para la definici\u00f3n anterior (hay otra variante, pero es importante tomar precauciones contra las URL arbitrarias por razones de seguridad).<\/p>\n<h2>cURL y solicitudes de WordPress<\/h2>\n<p>De todos modos, entonces, \u00bfc\u00f3mo se ver\u00eda <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-00-get-curl-response-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una funci\u00f3n<\/a> si tuvi\u00e9ramos que usar esta 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>En resumen (y esto es t\u00edpico para la mayor\u00eda de las solicitudes cURL):<\/p>\n<ul>\n<li>inicializar la biblioteca cURL,<\/li>\n<li><a href=\"https:\/\/curl.haxx.se\/docs\/manpage.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">establecer opciones<\/a> espec\u00edficas para su solicitud (que variar\u00e1n en funci\u00f3n de dicha solicitud),<\/li>\n<li>hacer la solicitud,<\/li>\n<li>evaluar la respuesta<\/li>\n<li>capturar las excepciones necesarias.<\/li>\n<\/ul>\n<p>\u00bfY si tuvi\u00e9ramos que usar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/8762acc585d6b4987b23a1304615bd4d#file-01-safe-remote-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la misma variaci\u00f3n del c\u00f3digo<\/a> en 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>Esto es mucho m\u00e1s peque\u00f1o y posiblemente m\u00e1s f\u00e1cil de leer (al menos para aquellos que trabajan en WordPress). En t\u00e9rminos de argumentos, tampoco estoy pasando nada a la funci\u00f3n que no sea la URL.<\/p>\n<p>Si lee la documentaci\u00f3n de la API vinculada, ver\u00e1 que tenemos cierto control sobre eso; sin embargo, variar\u00e1 dependiendo de c\u00f3mo necesite comunicarse con un punto final determinado.<\/p>\n<p>Adem\u00e1s, la forma en que maneja el <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_error\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Error<\/a> depende de usted. Devolver una cadena vac\u00eda rara vez es la mejor opci\u00f3n; sin embargo, a los efectos de este ejemplo, es suficiente. El caso que buscamos principalmente es el cuerpo de la respuesta y ese es el enfoque del c\u00f3digo.<\/p>\n<h2>\u00bfCu\u00e1ndo usamos uno u otro?<\/h2>\n<p>Cuando se trata de trabajar con solicitudes remotas cURL y WordPress y determinar qu\u00e9 m\u00e9todo usar, tiendo a seguir esta regla:<\/p>\n<ul>\n<li>Si lo que necesito se puede lograr con una funci\u00f3n API de WordPress, la uso.<\/li>\n<li>Si no, usar\u00e9 cURL.<\/li>\n<\/ul>\n<p>No puedo proporcionar una regla m\u00e1s s\u00f3lida.<\/p>\n<p>En su lugar, mire el punto final que est\u00e1 comunicando, determine qu\u00e9 nivel de control necesita sobre la solicitud y tome una decisi\u00f3n sobre c\u00f3mo desea manejar la respuesta.<\/p>\n<p>A partir de ah\u00ed, deber\u00eda tener una buena idea de qu\u00e9 biblioteca usar.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las solicitudes remotas de cURL y WordPress nos permiten gran parte de la misma funcionalidad. Pero tenemos que ser capaces de determinar qu\u00e9 opci\u00f3n es la mejor.<\/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":[892,716,800,840],"tags":[1172],"class_list":["post-231381","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=231381"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231381\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/237087"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}