{"id":28977,"date":"2021-06-04T11:22:00","date_gmt":"2021-06-04T08:22:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28977"},"modified":"2021-10-17T16:29:02","modified_gmt":"2021-10-17T13:29:02","slug":"como-utilizar-guzzle-un-cliente-http-php-para-enviar-solicitudes-http","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/como-utilizar-guzzle-un-cliente-http-php-para-enviar-solicitudes-http\/","title":{"rendered":"C\u00f3mo utilizar Guzzle: un cliente HTTP PHP para enviar solicitudes HTTP"},"content":{"rendered":"<p>El desarrollador siempre se encuentra con una tarea en la que necesita enviar solicitudes HTTP a otros recursos y manejar la respuesta. La forma popular de realizar estas tareas es mediante el uso de un cURL. Sin embargo, usar cURL no es relativamente f\u00e1cil para un principiante. Adem\u00e1s, para escribir un script en cURL, su servidor deber\u00eda haber habilitado la extensi\u00f3n cURL.<\/p>\n<p><a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> es una alternativa a cURL. Es un cliente HTTP de PHP que facilita el env\u00edo de solicitudes HTTP y simplifica la integraci\u00f3n con los servicios web. Incluso, puedo decir por mi experiencia que Guzzle es mejor que cURL. Es simple y f\u00e1cil de usar. Si est\u00e1 utilizando Guzzle, no necesita tener la extensi\u00f3n cURL en su servidor. Le brinda un mejor formato de c\u00f3digo en comparaci\u00f3n con cURL.<\/p>\n<p>Dicho esto, veamos c\u00f3mo usar Guzzle en su aplicaci\u00f3n.<\/p>\n<h3>Instalaci\u00f3n<\/h3>\n<p>La forma recomendada de instalar Guzzle es a trav\u00e9s de Composer. Si no ha instalado Composer en su sistema, puede obtenerlo desde <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqu\u00ed<\/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=\"C\u00f3mo utilizar Guzzle: un cliente HTTP PHP para enviar solicitudes HTTP\" ><\/a><\/p>\n<p>Abra la terminal en el directorio ra\u00edz de su proyecto y ejecute el siguiente comando para instalar Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Guzzle proporciona soporte para todas las solicitudes HTTP que son GET, DELETE, HEAD, OPTIONS, PATCH, POST y PUT. En este tutorial, estudiamos c\u00f3mo usar Guzzle para enviar solicitudes HTTP y manejar respuestas con \u00e9l.<\/p>\n<p>Como ejemplo, tomo el servicio <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REQ | RES<\/a> que proporciona una API real falsa para probar solicitudes HTTP.<\/p>\n<h3>C\u00f3mo enviar una solicitud HTTP usando Guzzle<\/h3>\n<p>Tras la instalaci\u00f3n de la biblioteca Guzzle, debe incluir un entorno Guzzle en su archivo de la siguiente manera.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse GuzzleHttpClient;<\/code><\/pre>\n<p>Ahora intentemos algunas operaciones una por una como GET, POST, carga de archivo, copia de archivo de URL remota a un directorio local, PUT, PATCH y DELETE.<\/p>\n<h4>OBTENER Solicitud usando Guzzle<\/h4>\n<p>Si observa el sitio web de REQ | RES, proporcionaron algunos puntos finales para las solicitudes &#8216;GET&#8217;. Tomar\u00e9 el ejemplo del punto final &#8216;LIST USERS&#8217;. Para obtener la lista de usuarios, solicitan enviar una solicitud GET a este punto final <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>En Guzzle, enviaremos esta solicitud GET de la siguiente manera.<\/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>Primero extraje un &#8216;base_uri&#8217; (URL com\u00fan) como <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in<\/a>. Aqu\u00ed, el extremo final es &#8216;\/ api \/ users&#8217; y requiere un par\u00e1metro GET como &#8216;p\u00e1gina&#8217;. En Guzzle, puede enviar par\u00e1metros GET utilizando la matriz &#8216;consulta&#8217; como se muestra en el c\u00f3digo anterior.<\/p>\n<h4>Solicitud POST usando Guzzle<\/h4>\n<p>Normalmente, existen 2 tipos de solicitudes POST. Es posible que necesite POST par\u00e1metros como solicitud POST &#8216;application \/ x-www-form-urlencoded&#8217; o cargar datos codificados JSON como un cuerpo de la solicitud. Puede publicar datos codificados en JSON como se muestra a continuaci\u00f3n.<\/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>En el caso de la solicitud POST &#8216;application \/ x-www-form-urlencoded&#8217;, puede POST par\u00e1metros de la siguiente manera.<\/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>En algunos casos, los puntos finales de la API le piden que env\u00ede un token de autorizaci\u00f3n en cada solicitud HTTP. El usuario puede enviar este token como encabezados en su solicitud de 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>Copie el archivo desde el servidor remoto usando Guzzle<\/h4>\n<p>Si est\u00e1 buscando copiar un archivo desde un servidor remoto a su directorio local, Guzzle ser\u00e1 una mejor opci\u00f3n. Supongamos que desea copiar esta imagen en <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; en su directorio local. Escribiremos el c\u00f3digo como se muestra a continuaci\u00f3n.<\/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>Carga de archivos usando Guzzle<\/h4>\n<p>Como todos sabemos, para cargar archivos necesitamos establecer el cuerpo de la solicitud en un formulario &#8216;multipart \/ form-data&#8217;. El c\u00f3digo b\u00e1sico en Guzzle para cargar archivos se escribir\u00eda como se muestra a continuaci\u00f3n.<\/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 demostrar la carga del archivo, tomar\u00e9 un ejemplo en vivo de la <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API reSmush.it<\/a> que env\u00eda una versi\u00f3n optimizada de la imagen en respuesta. Necesita PUBLICAR su imagen en su punto final. El c\u00f3digo para usar Guzzle de la siguiente manera.<\/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 y DELETE Request usando Guzzle<\/h3>\n<p>Las solicitudes PUT y PATCH se utilizan para actualizar los recursos. Sin embargo, estas 2 solicitudes lo hacen de manera diferente.<\/p>\n<p>PUT sobrescribe toda la entidad si ya existe y crea un nuevo recurso si no existe. Si desea actualizar el nombre de una persona, debe enviar el recurso completo al realizar una solicitud 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>La solicitud PATCH aplica una actualizaci\u00f3n parcial al recurso. Significa que solo debe enviar los datos que desea actualizar y no afectar\u00e1 ni cambiar\u00e1 nada m\u00e1s. Entonces, si desea actualizar el nombre de una persona, solo se le pedir\u00e1 que env\u00ede el par\u00e1metro de nombre.<\/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>Una solicitud DELETE es sencilla. Solo necesita llegar al punto final de la siguiente manera.<\/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 conozcas Guzzle y los conceptos b\u00e1sicos de c\u00f3mo usarlo. Puede leer m\u00e1s sobre las opciones de solicitud de Guzzle en su <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\/request-options.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n<\/a>. Comparta sus pensamientos o sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/api-de-youtube-como-obtener-una-lista-de-videos-de-youtube-de-su-canal\/\" title=\"API de YouTube: c\u00f3mo obtener una lista de videos de YouTube de su canal\">API de YouTube: c\u00f3mo obtener una lista de videos de YouTube de su canal<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/tinypng-comprimir-imagenes-usando-php\/\" title=\"TinyPNG Comprimir im\u00e1genes usando PHP\">TinyPNG Comprimir im\u00e1genes usando PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/validacion-de-formularios-html-con-perejil\/\" title=\"Validaci\u00f3n de formularios HTML con perejil\">Validaci\u00f3n de formularios HTML con perejil<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <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 proporciona una forma perfecta de enviar solicitudes HTTP y gestionar la respuesta. En este art\u00edculo, estudiamos c\u00f3mo enviar solicitudes HTTP y manejar<\/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":[271],"tags":[849],"class_list":["post-28977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=28977"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/21661"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=28977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=28977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=28977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}