{"id":3962,"date":"2023-03-16T22:22:33","date_gmt":"2023-03-17T04:22:33","guid":{"rendered":"https:\/\/linuxitos.com\/main\/?p=3962"},"modified":"2023-03-17T10:00:19","modified_gmt":"2023-03-17T16:00:19","slug":"integrar-minio-storage-con-proyecto-laravel","status":"publish","type":"post","link":"https:\/\/linuxitos.com\/main\/integrar-minio-storage-con-proyecto-laravel\/","title":{"rendered":"Integrar MinIO Storage con proyecto Laravel"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/post_minio_laravel.png\"><img loading=\"lazy\" decoding=\"async\" width=\"860\" height=\"485\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/post_minio_laravel.png\" alt=\"\" class=\"wp-image-3963\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/post_minio_laravel.png 860w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/post_minio_laravel-300x169.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/post_minio_laravel-768x433.png 768w\" sizes=\"auto, (max-width: 860px) 100vw, 860px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Contexto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recientemente fue necesario separar una aplicaci\u00f3n web de los archivos que genera, por lo que se busc\u00f3 y se encontr\u00f3 MinIO para solventar el almacenamiento de archivos. (<a rel=\"noreferrer noopener\" href=\"https:\/\/blog.linuxitos.com\/post\/montar-contenedor-minio-storage-en-docker-fedora\" target=\"_blank\">Instalaci\u00f3n en docker<\/a>) En \u00e9ste post mostrar\u00e9 c\u00f3mo integrar MinIO con un proyecto Laravel<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.- Crear proyecto Laravel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear un proyecto de laravel con el siguiente comando:<\/p>\n\n\n\n<pre style=\"background: #363F48; border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">composer create-project laravel\/laravel project-minio<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2.- Instalar el paquete  league\/flysystem-aws-s3-v3:<\/h2>\n\n\n\n<pre style=\"background: #363F48; border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">composer require league\/flysystem-aws-s3-v3<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3.- Ahora configurar los accesos en el archivo .env<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los datos de MINIO_SECRET_ACCESS_KEY y MINIO_ACCESS_KEY_ID se obtienen cuando se cre\u00f3 el Service Account del usuario que se registr\u00f3 en el post: <a rel=\"noreferrer noopener\" href=\"https:\/\/blog.linuxitos.com\/post\/montar-contenedor-minio-storage-en-docker-fedora\" target=\"_blank\">instalaci\u00f3n de MinIO<\/a> si no se anot\u00f3 o guard\u00f3, se puede crear un nuevo service account.<\/p>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">MINIO_ACCESS_KEY_ID=pzwnKFgyD3pYD3DQ\nMINIO_SECRET_ACCESS_KEY=J7bhE7cPRaMkc0nQoNTiakyHKRy1Aa33\nMINIO_DEFAULT_REGION=us-east-1\nMINIO_BUCKET=files\nFILESYSTEM_CLOUD=minio\nMINIO_URL=http:\/\/127.0.0.1:9000\/${MINIO_BUCKET}\nMINIO_ENDPOINT=http:\/\/127.0.0.1:9000\nMINIO_USE_PATH_STYLE_ENDPOINT=true<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y buscar la configuraci\u00f3n que de nombre FILESYSTEM_DISK y cambiar a la siguiente forma:<\/p>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">FILESYSTEM_DISK=minio<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4.- Editar el archivo config\/filesystems.php<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Acceder y modificar el archivo <strong>config\/filesystems.php<\/strong> a\u00f1adiendo la siguiente l\u00ednea:<\/p>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">'cloud' =&gt; env('FILESYSTEM_CLOUD', 's3'),<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y en la secci\u00f3n de disks crear un nuevo array:<\/p>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">'minio' =&gt; [\n    'driver' =&gt; 's3',\n    'key' =&gt; env('MINIO_ACCESS_KEY_ID'),\n    'secret' =&gt; env('MINIO_SECRET_ACCESS_KEY'),\n    'region' =&gt; env('MINIO_DEFAULT_REGION'),\n    'bucket' =&gt; env('MINIO_BUCKET'),\n    'url' =&gt; env('MINIO_URL'),\n    'endpoint' =&gt; env('MINIO_ENDPOINT'),\n    'throw' =&gt; true,\n],<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5.- Crear controlador FileController<\/h2>\n\n\n\n<pre style=\"background: #363F48; border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">php artisan make:controller FileController<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y a\u00f1adir el siguiente contenido:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\Support\\Str;\n\nclass FileController extends Controller\n{\n\n    public function index(Request $request)\n    {\n        $data&#91;'archivos'] = &#91;];\n        $data&#91;'total'] = 0;\n        return view('main', $data);\n    }\n\n    public function store(Request $request)\n    {\n        $data = &#91;];\n        $archivos = &#91;];\n        $data&#91;'total'] = 0;\n        if ($request-&gt;hasfile('files')) {\n            foreach ($request-&gt;file('files') as $key =&gt; $file) {\n                $data&#91;'total'] ++;\n                $nombreArchivo = Str::random(4).'-'.Str::random(4).'.'.$file-&gt;getClientOriginalExtension();\n                $contenido = file_get_contents($file);\n                $path = Storage::cloud()-&gt;put($nombreArchivo, $contenido);\n                $archivos&#91;] = $nombreArchivo;\n            }\n        }\n        $data&#91;'archivos'] = $archivos;\n        return view('main', $data);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6.- Editar el archivo routes\/api.php<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abrir el archivo routes\/api.php y a\u00f1adir las siguientes rutas:<\/p>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">Route::post('file','App\\Http\\Controllers\\FileController@store');\nRoute::get('file','App\\Http\\Controllers\\FileController@show');<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7.- Editar el archivo routes\/web.php<\/h2>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">Route::get('\/', 'App\\Http\\Controllers\\FileController@index')-&gt;name('\/');\nRoute::get('\/', 'App\\Http\\Controllers\\FileController@index')-&gt;name('home');\nRoute::post('store', 'App\\Http\\Controllers\\FileController@store')-&gt;name('store');\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8.- Crear la vista views\/main.blade.php<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9sta vista contendr\u00e1 un formulario simple para subir archivos, y en autom\u00e1tico se suben a MinIO:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"302\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7-1024x302.png\" alt=\"\" class=\"wp-image-3970\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7-1024x302.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7-300x89.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7-768x227.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-7.png 1342w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;Storage MinIO Laravel&lt;\/title&gt;\n    &lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha1\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\"\n        integrity=\"sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3\/Jr59b6EGGoI1aFkw7cmDA6j6gD\" crossorigin=\"anonymous\"&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.10.3\/font\/bootstrap-icons.css\"&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/5.15.4\/css\/all.min.css\"\n        integrity=\"sha512-1ycn6IcaQQ40\/MKBW2W4Rhis\/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY\/NS5R+E6ztJQ==\"\n        crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" \/&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n    &lt;div class=\"container\"&gt;\n        &lt;header\n            class=\"d-flex flex-wrap align-items-center justify-content-center justify-content-md-between py-3 mb-4 border-bottom\"&gt;\n            &lt;a href=\"\/\" class=\"d-flex align-items-center col-md-3 mb-2 mb-md-0 text-dark text-decoration-none\"&gt;\n                &lt;svg class=\"bi me-2\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"&gt;\n                    &lt;use xlink:href=\"#bootstrap\"&gt;&lt;\/use&gt;\n                &lt;\/svg&gt;\n            &lt;\/a&gt;\n\n            &lt;ul class=\"nav col-12 col-md-auto mb-2 justify-content-center mb-md-0\"&gt;\n                &lt;li&gt;&lt;a href=\"#\" class=\"nav-link px-2 link-secondary\"&gt;Home&lt;\/a&gt;&lt;\/li&gt;\n                &lt;li&gt;&lt;a href=\"#\" class=\"nav-link px-2 link-dark\"&gt;About&lt;\/a&gt;&lt;\/li&gt;\n            &lt;\/ul&gt;\n\n            &lt;div class=\"col-md-3 text-end\"&gt;\n                &lt;button type=\"button\" class=\"btn btn-outline-primary me-2\"&gt;Login&lt;\/button&gt;\n                &lt;button type=\"button\" class=\"btn btn-primary\"&gt;Sign-up&lt;\/button&gt;\n            &lt;\/div&gt;\n        &lt;\/header&gt;\n    &lt;\/div&gt;\n    &lt;div class=\"container\"&gt;\n        &lt;div class=\"row\"&gt;\n            &lt;div class=\"col-md-12\"&gt;\n                &lt;form action=\"{{route('store')}}\" method=\"post\" accept-charset=\"utf-8\" enctype=\"multipart\/form-data\"&gt;\n                    @csrf\n                    &lt;div class=\"row\"&gt;\n                        &lt;div class=\"col-md-4\"&gt;\n                            &lt;div class=\"input-group mb-3\"&gt;\n                                &lt;label class=\"input-group-text\" for=\"file1\"&gt;Archivo uno&lt;\/label&gt;\n                                &lt;input type=\"file\" class=\"form-control\" name=\"files&#91;]\" id=\"file1\" required=\"\" multiple=\"\"&gt;\n                            &lt;\/div&gt;\n                        &lt;\/div&gt;\n                        &lt;div class=\"col-md-4\"&gt;\n                            &lt;button type=\"submit\" class=\"btn btn-success float-end\"&gt;Enviar&lt;\/button&gt;\n                        &lt;\/div&gt;\n                    &lt;\/div&gt;\n                &lt;\/form&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"col-md-12\"&gt;\n                &lt;span&gt;Total archivos: {{$total}}&lt;\/span&gt;\n                &lt;table class=\"table\"&gt;\n                    &lt;thead&gt;\n                        &lt;tr&gt;\n                            &lt;th scope=\"col\"&gt;#&lt;\/th&gt;\n                            &lt;th scope=\"col\"&gt;Archivo&lt;\/th&gt;\n                        &lt;\/tr&gt;\n                    &lt;\/thead&gt;\n                    &lt;tbody&gt;\n                        @forelse ($archivos as $archivo)\n                            &lt;tr&gt;\n                                &lt;td&gt;{{$loop-&gt;iteration}}&lt;\/td&gt;\n                                &lt;td&gt;\n                                    &lt;a href=\"{{ asset(env('MINIO_URL')).'\/'.$archivo}}\" target=\"_blank\"&gt;{{$archivo}}&lt;\/a&gt;\n                                &lt;\/td&gt;\n                            &lt;\/tr&gt;\n                        @empty\n                            &lt;tr&gt;\n                                &lt;td colspan=\"2\" class=\"text-center\"&gt;Sin archivos recientes&lt;\/td&gt;\n                            &lt;\/tr&gt;\n                        @endforelse                      \n                    &lt;\/tbody&gt;\n                &lt;\/table&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    &lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha1\/dist\/js\/bootstrap.bundle.min.js\"\n        integrity=\"sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN\"\n        crossorigin=\"anonymous\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Al iniciar en MinIO y navegar al Bucket\/Files se podr\u00e1n visualizar los archivos subidos<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8-1024x572.png\" alt=\"\" class=\"wp-image-3971\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8-1024x572.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8-300x168.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8-768x429.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8-1536x858.png 1536w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2023\/03\/image-8.png 1725w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">9.- Probar el proyecto<\/h2>\n\n\n\n<pre style=\"background:#F2F2F2; border-radius: 2px; border: 1px solid #aaa; box-sizing: border-box; color: #222; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">php artisan serve<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y ahora navegar al enlace: <a rel=\"noreferrer noopener\" href=\"http:\/\/127.0.0.1:8000\/\" target=\"_blank\">http:\/\/127.0.0.1:8000\/<\/a> para comenzar a subir archivos. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10.- Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En \u00e9ste ejemplo b\u00e1sico, se suben los archivos a MinIO, sin embargo no se guardan los enlaces a una base de datos por parte del proyecto de laravel, sin embargo, \u00e9ste proyecto puede servir como base e implementar las funcionalidades espec\u00edficas que se requieran para cada caso.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contexto Recientemente fue necesario separar una aplicaci\u00f3n web de los archivos que genera, por lo que se busc\u00f3 y se encontr\u00f3 MinIO para solventar el almacenamiento de archivos. (Instalaci\u00f3n en docker) En \u00e9ste post mostrar\u00e9 c\u00f3mo integrar MinIO con un proyecto Laravel 1.- Crear proyecto Laravel Crear un proyecto de laravel con el siguiente comando: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3963,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1889],"tags":[1694,1638,1906,1556,1912,1911],"class_list":["post-3962","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-web","tag-docker","tag-laravel","tag-minio","tag-php","tag-storage","tag-web"],"_links":{"self":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3962","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/comments?post=3962"}],"version-history":[{"count":8,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3962\/revisions"}],"predecessor-version":[{"id":3976,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3962\/revisions\/3976"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media\/3963"}],"wp:attachment":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media?parent=3962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/categories?post=3962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/tags?post=3962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}