{"id":25670,"date":"2021-06-04T11:40:00","date_gmt":"2021-06-04T08:40:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=25670"},"modified":"2021-10-18T03:05:50","modified_gmt":"2021-10-18T00:05:50","slug":"come-utilizzare-guzzle-un-client-http-php-per-l-invio-di-richieste-http","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/it\/come-utilizzare-guzzle-un-client-http-php-per-l-invio-di-richieste-http\/","title":{"rendered":"Come utilizzare Guzzle: un client HTTP PHP per l&#8217;invio di richieste HTTP"},"content":{"rendered":"<p>Lo sviluppatore si imbatte sempre in un&#8217;attivit\u00e0 in cui deve inviare richieste HTTP ad altre risorse e gestire la risposta. Il modo pi\u00f9 diffuso per eseguire queste attivit\u00e0 \u00e8 utilizzare un cURL. Tuttavia, l&#8217;utilizzo del cURL non \u00e8 relativamente facile per un principiante. Inoltre, per scrivere uno script in cURL, il tuo server dovrebbe aver abilitato l&#8217;estensione cURL.<\/p>\n<p><a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> \u00e8 un&#8217;alternativa a cURL. \u00c8 un client HTTP PHP che semplifica l&#8217;invio di richieste HTTP e banale l&#8217;integrazione con i servizi web. Anche, posso dire dalla mia esperienza che Guzzle \u00e8 meglio di cURL. \u00c8 semplice e facile da usare. Se stai usando Guzzle, non hai bisogno di avere l&#8217;estensione cURL sul tuo server. Ti offre una migliore formattazione del codice rispetto a cURL.<\/p>\n<p>Detto questo, vediamo come utilizzare Guzzle nella tua applicazione.<\/p>\n<h3>Installazione<\/h3>\n<p>Il modo consigliato per installare Guzzle \u00e8 attraverso il Composer. Se non hai installato Composer sul tuo sistema, puoi scaricarlo da <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qui<\/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=\"Come utilizzare Guzzle: un client HTTP PHP per l&#039;invio di richieste HTTP\" ><\/a><\/p>\n<p>Apri il terminale nella directory principale del tuo progetto ed esegui il comando seguente per installare Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Guzzle fornisce supporto per tutte le richieste HTTP che sono GET, DELETE, HEAD, OPTIONS, PATCH, POST e PUT. In questo tutorial, studiamo come utilizzare Guzzle per inviare richieste HTTP e gestire le risposte con esso.<\/p>\n<p>Ad esempio, prendo il servizio <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REQ|RES<\/a> che fornisce una falsa API reale per testare le richieste HTTP.<\/p>\n<h3>Come inviare una richiesta HTTP utilizzando Guzzle<\/h3>\n<p>Al momento dell&#8217;installazione della libreria Guzzle, \u00e8 necessario includere un ambiente Guzzle nel file come segue.<\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse GuzzleHttpClient;<\/code><\/pre>\n<p>Ora proviamo alcune operazioni una per una come GET, POST, Caricamento file, copia file dall&#8217;URL remoto a una directory locale, PUT, PATCH e DELETE.<\/p>\n<h4>OTTIENI la richiesta usando Guzzle<\/h4>\n<p>Se guardi il sito web REQ|RES, hanno fornito alcuni endpoint per le richieste &quot;GET&quot;. Prender\u00f2 l&#8217;esempio dell&#8217;endpoint &#8216;LIST USERS&#8217;. Per ottenere l&#8217;elenco degli utenti, chiedono di inviare una richiesta GET a questo 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>In Guzzle, invieremo questa richiesta GET come segue.<\/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>Per prima cosa ho estratto un &quot;base_uri&quot; (URL comune) come <a href=\"https:\/\/reqres.in\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/reqres.in<\/a>. Qui, l&#8217;endpoint finale \u00e8 &quot;\/api\/users&quot; e richiede un parametro GET come &quot;pagina&quot;. In Guzzle, puoi inviare i parametri GET usando l&#8217;array &#8216;query&#8217; come mostrato nel codice sopra.<\/p>\n<h4>POST Richiesta utilizzando Guzzle<\/h4>\n<p>Normalmente, ci sono 2 tipi di richieste POST. Potrebbe essere necessario eseguire il POST dei parametri come richiesta POST &quot;application\/x-www-form-urlencoded&quot; o caricare i dati codificati JSON come corpo della richiesta. Puoi pubblicare dati codificati JSON come mostrato di seguito.<\/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>Nel caso della richiesta POST &quot;application\/x-www-form-urlencoded&quot;, \u00e8 possibile eseguire il POST dei parametri come segue.<\/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>In alcuni casi, gli endpoint API ti chiedono di inviare il token di autorizzazione in ogni richiesta HTTP. L&#8217;utente pu\u00f2 inviare questo token come intestazioni nella tua richiesta 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>Copia file da server remoto usando Guzzle<\/h4>\n<p>Se stai cercando di copiare un file da un server remoto alla tua directory locale, Guzzle sar\u00e0 un&#8217;opzione migliore. Supponiamo che tu voglia copiare questa immagine su <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> come &quot;blog.jpg&quot; nella tua directory locale. Scriveremo il codice per esso come mostrato di seguito.<\/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>Caricamento di file utilizzando Guzzle<\/h4>\n<p>Come tutti sappiamo, per caricare i file dobbiamo impostare il corpo della richiesta su un modulo &#8216;multipart\/form-data&#8217;. Il codice di base in Guzzle per caricare i file sarebbe scritto come di seguito.<\/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>Per dimostrare il caricamento del file, prender\u00f2 un esempio dal <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vivo dell&#8217;API<\/a> di <a href=\"https:\/\/resmush.it\/api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reSmush.it<\/a> che invia una versione ottimizzata dell&#8217;immagine in risposta. Devi POSTARE la tua immagine al loro endpoint. Il codice per questo usando Guzzle come segue.<\/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 Richiesta utilizzando Guzzle<\/h3>\n<p>Le richieste PUT e PATCH vengono utilizzate per aggiornare le risorse. Tuttavia, queste 2 richieste lo fanno in modo diverso.<\/p>\n<p>PUT sovrascrive l&#8217;intera entit\u00e0 se esiste gi\u00e0 e crea una nuova risorsa se non esiste. Se vuoi aggiornare il nome di una persona, devi inviare l&#8217;intera risorsa quando fai una richiesta 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 richiesta PATCH applica un aggiornamento parziale alla risorsa. Significa che devi solo inviare i dati che desideri aggiornare e questo non influenzer\u00e0 o cambier\u00e0 nient&#8217;altro. Quindi, se vuoi aggiornare il nome di una persona, ti verr\u00e0 richiesto solo di inviare il parametro 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>Una richiesta DELETE \u00e8 semplice. Hai solo bisogno di colpire l&#8217;endpoint come segue.<\/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>Spero che tu abbia avuto modo di conoscere Guzzle e le basi su come usarlo. Puoi leggere di pi\u00f9 sulle opzioni di richiesta Guzzle nella loro <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\/request-options.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentazione<\/a>. Si prega di condividere i tuoi pensieri o suggerimenti nella sezione commenti qui sotto.<\/p>\n<h4>articoli Correlati<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/it\/api-di-youtube-come-ottenere-l-elenco-dei-video-di-youtube-del-tuo-canale\/\" title=\"API di YouTube - Come ottenere l&#039;elenco dei video di YouTube del tuo canale\">API di YouTube &#8211; Come ottenere l&#8217;elenco dei video di YouTube del tuo canale<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/it\/tinypng-comprimi-le-immagini-usando-php\/\" title=\"TinyPNG Comprimi le immagini usando PHP\">TinyPNG Comprimi le immagini usando PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/it\/convalida-del-modulo-html-utilizzando-prezzemolo\/\" title=\"Convalida del modulo HTML utilizzando prezzemolo\">Convalida del modulo HTML utilizzando prezzemolo<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <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 fornisce un modo semplice per inviare una richiesta HTTP e gestire la risposta. In questo articolo, studiamo come inviare e gestire la richiesta HTTP<\/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":[276],"tags":[846],"class_list":["post-25670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-7","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/posts\/25670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/comments?post=25670"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/posts\/25670\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/media\/21661"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/media?parent=25670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/categories?post=25670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/it\/wp-json\/wp\/v2\/tags?post=25670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}