{"id":813,"date":"2022-03-12T02:53:31","date_gmt":"2022-03-12T02:53:31","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=813"},"modified":"2022-03-12T02:53:31","modified_gmt":"2022-03-12T02:53:31","slug":"apex-enviando-arquivos-para-o-object-storage","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2022\/03\/12\/apex-enviando-arquivos-para-o-object-storage\/","title":{"rendered":"APEX &#8211; Enviando arquivos para o  Object Storage"},"content":{"rendered":"\n<p>O OCI Object storage possui uma funcionalidade muito legal chamada PAR (Pre-Authenticated Requests) que gera uma URL \u00fanica e tempor\u00e1ria que te permite interagir com buckets\/objetos sem autentica\u00e7\u00e3o, ent\u00e3o na pr\u00e1tica voc\u00ea poderia ter um bucket privado e compartilhar os arquivos dele com quem quiser, pensando nisso e baseado nesse artigo <a rel=\"noreferrer noopener\" href=\"https:\/\/blogs.oracle.com\/oraclemagazine\/post\/better-file-storage-in-oracle-cloud\" target=\"_blank\">aqui<\/a> resolvi criar uma interface em APEX que recebe arquivos como uma caixa postal, a pessoa tem seu endere\u00e7o (PAR) e te entrega o arquivo.<\/p>\n\n\n\n<p>O PAR<\/p>\n\n\n\n<p>Um PAR pode ser criado de diversas formas(console web, api, cli..) e com diversas op\u00e7\u00f5es:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"436\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-14-1024x436.png\" alt=\"\" class=\"wp-image-817\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-14-1024x436.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-14-300x128.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-14-768x327.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-14.png 1244w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Cada PAR precisa de um nome e de par\u00e2metros de acesso, no nosso caso precisamos criar um do tipo Bucket com permiss\u00e3o de escrita (Permit Object writes), voc\u00ea tamb\u00e9m pode configurar um prazo de validade da  URL, isso \u00e9 muito util quando voc\u00ea quer compartilhar um arquivo com algu\u00e9m e quer ter certeza que ap\u00f3s determinado tempo o arquivo n\u00e3o esteja mais acess\u00edvel.<\/p>\n\n\n\n<p>Ao criar o PAR, copie a URL para uma localiza\u00e7\u00e3o segura pois ela s\u00f3 \u00e9 exibida uma \u00fanica vez!<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">APEX<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"621\" height=\"490\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-15.png\" alt=\"\" class=\"wp-image-819\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-15.png 621w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-15-300x237.png 300w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/figure><\/div>\n\n\n\n<p>Aqui no meu caso estou usando um APEX como servi\u00e7o, mas voc\u00ea pode usar o que estiver a sua disposi\u00e7\u00e3o, tamb\u00e9m no meu caso, optei por fazer uma aplica\u00e7\u00e3o p\u00fablica(sem login) e para isso precisei alterar algumas op\u00e7\u00f5es, no workspace internal eu precisei ir em Manage Instance -> Security e habilitar a op\u00e7\u00e3o Allow Public File upload:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"713\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-16.png\" alt=\"\" class=\"wp-image-821\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-16.png 723w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-16-300x296.png 300w\" sizes=\"auto, (max-width: 723px) 100vw, 723px\" \/><\/figure><\/div>\n\n\n\n<p>Ap\u00f3s isso, criei meu Workspace(que aqui se chama upload) e criei uma p\u00e1gina simples, tive que alterar a op\u00e7\u00e3o Authentication  para public, lembrando que talvez no seu caso voc\u00ea n\u00e3o queira\/precise fazer isso:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"137\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-25-1024x137.png\" alt=\"\" class=\"wp-image-834\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-25-1024x137.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-25-300x40.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-25-768x103.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-25.png 1183w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Esses s\u00e3o os meus componentes:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"808\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-18.png\" alt=\"\" class=\"wp-image-823\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-18.png 703w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-18-261x300.png 261w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/figure><\/div>\n\n\n\n<p>Basicamente precisamos de um objeto do tipo File Browse, um campo de texto(que vai receber nosso PAR) e um bot\u00e3o que vai juntar tudo isso em uma a\u00e7\u00e3o \u00fanica.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">File Browse<\/h4>\n\n\n\n<p>Esse objeto \u00e9 bem simples, ele faz uma ponte entre um arquivo em sua m\u00e1quina e uma tabela no banco do APEX, voc\u00ea pode criar uma tabela customizada para armazenar seus objetos, mas nesse caso estou usando a padr\u00e3o que \u00e9 a apex_application_temp_files, arraste esse recurso para a sua p\u00e1gina, ele possui alguns modelos, aqui estou usando um que voc\u00ea arrasta os arquivos da sua m\u00e1quina para ele, edite a seguinte op\u00e7\u00e3o para garantir que o objeto v\u00e1 ser apagado logo ap\u00f3s o envio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"925\" height=\"56\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-20.png\" alt=\"\" class=\"wp-image-826\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-20.png 925w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-20-300x18.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-20-768x46.png 768w\" sizes=\"auto, (max-width: 925px) 100vw, 925px\" \/><\/figure>\n\n\n\n<p>Caso queira, voc\u00ea tamb\u00e9m pode adicionar algumas valida\u00e7\u00f5es como tamanho m\u00e1ximo e formato de arquivo aceito, aqui no meu caso n\u00e3o alterei mais nada.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campo texto<\/h4>\n\n\n\n<p>Aqui usei um objeto do tipo Text Field com o tipo  URL<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"337\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-21.png\" alt=\"\" class=\"wp-image-828\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-21.png 907w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-21-300x111.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-21-768x285.png 768w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><\/figure><\/div>\n\n\n\n<p>Marquei a op\u00e7\u00e3o Required para que fique uma mensagem informando que um valor precisa ser passado e tamb\u00e9m adicionei uma valida\u00e7\u00e3o (no bot\u00e3o de upload) para caso ele esteja vazio que o upload n\u00e3o comece.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Bot\u00e3o de upload<\/h4>\n\n\n\n<p>Para esse bot\u00e3o usei a op\u00e7\u00e3o &#8220;Hot&#8221; com duas a\u00e7\u00f5es din\u00e2micas, uma que pega o valor do campo texto (P1_PAR) e faz o uso do apex_web_service para fazer a requis\u00e7ao de envio e outra para validar se o campo texto possui um valor.<\/p>\n\n\n\n<p>A de upload \u00e9 do tipo submit page e tem a seguinte configura\u00e7\u00e3o:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"171\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-22.png\" alt=\"\" class=\"wp-image-829\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-22.png 919w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-22-300x56.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-22-768x143.png 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/figure><\/div>\n\n\n\n<p>Quando um evento do tipo Click acontecer no bot\u00e3o, ele vai fazer um submit page que tem o seguinte processo  atrelado a ele:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"398\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23-1024x398.png\" alt=\"\" class=\"wp-image-830\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23-1024x398.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23-300x117.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23-768x299.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23-1536x597.png 1536w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-23.png 1906w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>O c\u00f3digo que ele chama \u00e9 o que est\u00e1 no tutorial de intera\u00e7\u00e3o com o Object storage com algumas pequenas altera\u00e7\u00f5es, aqui por exemplo n\u00e3o fazemos autentica\u00e7\u00e3o e nossa URL vai ser passada pelo usu\u00e1rio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>declare\r\n  l_request_url varchar2(32767);\r\n  l_content_length number;\r\n\r\n  l_response clob;\r\n    \r\n  upload_failed_exception exception;\r\nbegin\r\n  for file in (\r\n    select * from apex_application_temp_files\r\n    where name = :P2_FILE\r\n  ) loop\r\n        l_request_url := :P1_PAR  || apex_util.url_encode(file.filename);\r\n    apex_web_service.g_request_headers(1).name := \r\n      'Content-Type';\r\n    apex_web_service.g_request_headers(1).value :=\r\n      file.mime_type;\r\n    l_response := apex_web_service.make_rest_request(\r\n      p_url => l_request_url\r\n      , p_http_method => 'PUT'\r\n      , p_body_blob => file.blob_content\r\n    );\r\n\r\n    if apex_web_service.g_status_code != 200 then\r\n      raise upload_failed_exception;\r\n    end if;\r\n  end loop;\r\ndelete from apex_application_temp_files where name = :P2_FILE;\r\nend;<\/code><\/pre>\n\n\n\n<p>A parte importante desse c\u00f3digo s\u00e3o as vari\u00e1veis :P2_FILE (nome do nosso objeto File Browse) e :P1_PAR(nome do nosso campo de texto).<\/p>\n\n\n\n<p>A valida\u00e7\u00e3o se o campo texto possui valor \u00e9 a seguinte:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"260\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24-1024x260.png\" alt=\"\" class=\"wp-image-832\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24-1024x260.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24-300x76.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24-768x195.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24-1536x390.png 1536w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-24.png 1790w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Juntando tudo isso n\u00f3s temos uma p\u00e1gina bem simples :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"736\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-17.png\" alt=\"\" class=\"wp-image-822\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-17.png 601w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-17-245x300.png 245w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Utiliza\u00e7\u00e3o<\/h4>\n\n\n\n<p>Crie um PAR com a op\u00e7\u00e3o \u00a0Permit object writes marcada:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"287\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-26.png\" alt=\"\" class=\"wp-image-835\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-26.png 935w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-26-300x92.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-26-768x236.png 768w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/figure>\n\n\n\n<p>Na p\u00e1gina da aplica\u00e7\u00e3o no campo de texto coloque o seu PAR e selecione o arquivo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"466\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-27.png\" alt=\"\" class=\"wp-image-836\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-27.png 474w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-27-300x295.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<p>Ao clicar em Upload ele j\u00e1 deve come\u00e7ar a ser enviado:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-28-1024x425.png\" alt=\"\" class=\"wp-image-837\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-28-1024x425.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-28-300x125.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-28-768x319.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-28.png 1036w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>E o arquivo logo deve aparecer no bucket:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-29.png\" alt=\"\" class=\"wp-image-838\" width=\"840\" height=\"172\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-29.png 957w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-29-300x61.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-29-768x157.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/figure><\/div>\n\n\n\n<p>Caso a pessoa n\u00e3o entre o PAR, a nossa valida\u00e7\u00e3o entra em vigor:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"346\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-30-1024x346.png\" alt=\"\" class=\"wp-image-840\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-30-1024x346.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-30-300x101.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-30-768x260.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/03\/image-30.png 1174w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Bem pessoal, espero que tenham gostado dessa integra\u00e7\u00e3o e espero que acompanhem a evolu\u00e7\u00e3o dela pois ainda vou fazer algumas melhorias.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O OCI Object storage possui uma funcionalidade muito legal chamada PAR (Pre-Authenticated Requests) que gera uma URL \u00fanica e tempor\u00e1ria que te permite interagir com buckets\/objetos sem autentica\u00e7\u00e3o, ent\u00e3o na pr\u00e1tica voc\u00ea poderia ter um bucket privado e compartilhar os arquivos dele com quem quiser, pensando nisso e baseado nesse artigo aqui resolvi criar uma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":822,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[1],"tags":[],"class_list":["post-813","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/813","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=813"}],"version-history":[{"count":10,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/813\/revisions"}],"predecessor-version":[{"id":841,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/813\/revisions\/841"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/822"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=813"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}