{"id":416,"date":"2012-06-21T21:14:43","date_gmt":"2012-06-22T00:14:43","guid":{"rendered":"http:\/\/www.nextframework.org\/site\/416\/tutorial\/progressbarutilizando-o-recurso-de-barras-de-progresso-do-next"},"modified":"2015-03-02T23:34:06","modified_gmt":"2015-03-03T02:34:06","slug":"progressbarutilizando-o-recurso-de-barras-de-progresso-do-next","status":"publish","type":"post","link":"https:\/\/www.nextframework.org\/site\/416\/tutorial\/progressbarutilizando-o-recurso-de-barras-de-progresso-do-next","title":{"rendered":"ProgressBar&ndash;Utilizando o recurso de barras de progresso do Next"},"content":{"rendered":"<p>O Next oferece um recurso de barra de progresso atrav\u00e9s da tag <span style=\"font-family: 'Courier New'; color: #008000\"><strong><span style=\"font-size: x-small;\">&lt;n:progressbar&gt;<\/span><\/strong><\/span>. O programador n\u00e3o precisa lidar com as funcionalidades AJAX envolvidas nesse processo. Nesse tutorial \u00e9 mostrado um exemplo de utiliza\u00e7\u00e3o dessa tag.<\/p>\n<p><!--more--> A funcionalidade da barra de progressos pode ser dividida conceitualmente em tr\u00eas partes:<\/p>\n<ul>\n<li>Um objeto da interface <span style=\"font-family: 'Courier New'; color: #8000b0; font-size: x-small\"><span style=\"font-size: x-small;\">ProgressTask<\/span><\/span> que representa a tarefa a ser executada.<\/li>\n<li>A exibi\u00e7\u00e3o para o usu\u00e1rio, criada atrav\u00e9s da tag <span style=\"font-family: 'Courier New'; color: #008000\"><span style=\"font-size: x-small;\"><strong>&lt;n:progressbar&gt;<\/strong><span style=\"color: #000000\">.<\/span><\/span><\/span><\/li>\n<li>E o modelo, representado pela interface <span style=\"font-family: 'Courier New'; color: #8000b0; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor<\/span><\/span>,\u00a0 que \u00e9 atualizado pela tarefa e exibido pelos componentes gerados pela tag.<\/li>\n<\/ul>\n<ul>O resultado final da barra de progresso \u00e9 mostrado abaixo:<\/ul>\n<ul><a href=\"http:\/\/www.nextframework.org\/site\/wp-content\/uploads\/2012\/06\/progressbar.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"progressbar\" src=\"http:\/\/www.nextframework.org\/site\/wp-content\/uploads\/2012\/06\/progressbar_thumb.png\" border=\"0\" alt=\"progressbar\" width=\"425\" height=\"72\" \/><\/a><\/ul>\n<p>O primeiro passo para se utilizar a barra de tarefas \u00e9 criar a tarefa. Uma tarefa \u00e9 uma classe que implementa a interface <span style=\"font-family: 'Courier New'; color: #8000b0; font-size: x-small\"><span style=\"font-size: x-small;\">ProgressTask<\/span><\/span>. Essa interface define apenas um m\u00e9todo <span style=\"font-family: 'Courier New'; font-size: x-small\"><strong>run<\/strong><\/span> que deve conter o algoritmo de execu\u00e7\u00e3o da tarefa. O c\u00f3digo abaixo mostra um exemplo de tarefa utilizando uma classe an\u00f4nima.<\/p>\n<p><span style=\"font-family: 'Courier New'\"><span style=\"font-size: x-small;\">ProgressTask tarefa = new ProgressTask() {<br \/>\npublic void run(IProgressMonitor progressMonitor) throws Exception {<br \/>\n\/\/ aqui vem o c\u00f3digo da tarefa<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'\"><span style=\"font-size: x-small;\"> }<br \/>\n};<\/span><\/span><\/p>\n<p>O m\u00e9todo <span style=\"font-family: 'Courier New'; font-size: x-small\"><strong><span style=\"font-size: x-small;\">run<\/span><\/strong><\/span> recebe como par\u00e2metro um <span style=\"font-family: 'Courier New'; color: #72009d; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor<\/span><\/span>. Atrav\u00e9s desse objeto \u00e9 poss\u00edvel atualizar o estado da tarefa. O primeiro passo para inicializa\u00e7\u00e3o da tarefa \u00e9 chamar o m\u00e9todo <strong><span style=\"font-family: 'Courier New'; font-size: x-small\"><span style=\"font-size: x-small;\">beginTask<\/span><\/span><\/strong>, que recebe o nome da tarefa e a quantidade de trabalhos que essa tarefa ir\u00e1 executar. Se uma tarefa ir\u00e1 iteragir em 50 elementos, \u00e9 interessante chamar o <span style=\"font-family: 'Courier New'; font-size: x-small\"><strong><span style=\"font-size: x-small;\">beginTask<\/span><\/strong><\/span> com o valor de 50. Exemplo:<\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: x-small\"><span style=\"font-size: x-small;\">progressMonitor.beginTask(&#8220;Iniciando progresso&#8221;, 50);<\/span><\/span><\/p>\n<p>Para cada etapa da tarefa cumprida, chama-se o m\u00e9todo worked, passando como par\u00e2metro a quantidade de trabalho realizado. Exemplo:<\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: x-small\"><span style=\"font-size: x-small;\">progressMonitor.worked(1);<\/span><\/span><\/p>\n<p>Com a tarefa criada \u00e9 poss\u00edvel criar a parte visual da barra de progressos. A barra de progressos e a tarefa utilizam o mesmo objeto\u00a0 <span style=\"font-family: 'Courier New'; color: #72009d; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor<\/span> <\/span>para se manterem sincronizadas. Um objeto <span style=\"font-family: 'Courier New'; color: #72009d; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor<\/span> <\/span>deve ser conseguido atrav\u00e9s da classe <span style=\"font-family: 'Courier New'; color: #72009d; font-size: x-small\"><span style=\"font-size: x-small;\">ProgressTaskFactory<\/span><\/span>. O exemplo abaixo mostra como conseguir um <span style=\"font-family: 'Courier New'; color: #72009d; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor<\/span><\/span> para uma tarefa.<\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: x-small\"><span style=\"font-size: x-small;\">IProgressMonitor progressMonitor = ProgressTaskFactory.startTask(tarefa);<\/span><br \/>\n<\/span><br \/>\nEsse progressMonitor deve ser salvo no request, e ent\u00e3o utilizado pela tag <span style=\"font-family: 'Courier New'; color: #008000\"><strong><span style=\"font-size: x-small;\">&lt;n:progressbar&gt;<\/span> <\/strong><\/span>no JSP, como mostra o exemplo abaixo:<\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: x-small\"><span style=\"font-size: x-small;\">&lt;n:progressBar progressMonitor=&#8221;${progressMonitor}&#8221;\/&gt;<\/span><\/span><\/p>\n<p>Veja o c\u00f3digo fonte das classes para mais informa\u00e7\u00f5es sobre a barra de progresso. Um objeto da interface <span style=\"font-family: 'Courier New'; color: #8000b0; font-size: x-small\"><span style=\"font-size: x-small;\">ProgressTask<\/span><\/span> n\u00e3o pode acessar o request quando uma tarefa \u00e9 executada. Por isso, todas as informa\u00e7\u00f5es que a tarefa ir\u00e1 precisar devem ser capturadas do request antes de a tarefa ser inicializada.<\/p>\n<p>O exemplo abaixo mostra o c\u00f3digo completo de um controller e um JSP que utilizam a barra de progresso.<\/p>\n<p><strong><span style=\"font-size: x-small\"><span style=\"font-size: x-small;\">Controller<\/span><\/span><\/strong><\/p>\n<p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http:\/\/www.java2html.de     = --><\/p>\n<div class=\"java\">\n<p><!-- end source code --><\/p>\n<p><!-- start Java2Html link --><\/p>\n<p><!-- end Java2Html link --><\/p>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"#ffffff\">\n<tbody>\n<tr><!-- start source code --><\/p>\n<td align=\"left\" valign=\"top\"><code><span style=\"color: #7f0055;\"><strong>package <\/strong><\/span><span style=\"color: #000000;\">org.next.example.progressbar;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.controller.Controller;<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.controller.DefaultAction;<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.controller.MultiActionController;<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.progress.IProgressMonitor;<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.progress.ProgressTask;<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>import <\/strong><\/span><span style=\"color: #000000;\">org.nextframework.progress.ProgressTaskFactory;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #646464;\">@Controller<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #000000;\">path=<\/span><span style=\"color: #2a00ff;\">\"\/site\/progressbar\"<\/span><span style=\"color: #000000;\">)<\/span><br \/>\n<span style=\"color: #7f0055;\"><strong>public class <\/strong><\/span><span style=\"color: #000000;\">ProgressBarExample <\/span><span style=\"color: #7f0055;\"><strong>extends <\/strong><\/span><span style=\"color: #000000;\">MultiActionController <\/span><span style=\"color: #000000;\">{<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #646464;\">@DefaultAction<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>public <\/strong><\/span><span style=\"color: #000000;\">String index<\/span><span style=\"color: #000000;\">(){<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #3f5fbf;\">\/**<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #3f5fbf;\">* Tarefa que ser\u00e1 utilizada em conjunto com a barra de progresso<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #3f5fbf;\">*\/<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">ProgressTask tarefa = <\/span><span style=\"color: #7f0055;\"><strong>new <\/strong><\/span><span style=\"color: #000000;\">ProgressTask<\/span><span style=\"color: #000000;\">() {<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>public <\/strong><\/span><span style=\"color: #7f0055;\"><strong>void <\/strong><\/span><span style=\"color: #000000;\">run<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #000000;\">IProgressMonitor progressMonitor<\/span><span style=\"color: #000000;\">) <\/span><span style=\"color: #7f0055;\"><strong>throws <\/strong><\/span><span style=\"color: #000000;\">Exception <\/span><span style=\"color: #000000;\">{<br \/>\n<\/span><span style=\"color: #3f7f5f;\">\/\/dentro do m\u00e9todo run deve ser executado o trabalho<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #3f7f5f;\">\/\/o objeto progressMonitor permite a atualiza\u00e7\u00e3o da etapa atual do trabalho (isso ser\u00e1 refletido na tela)<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">progressMonitor.subTask<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"Trabalhando\"<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">; <\/span><span style=\"color: #3f7f5f;\">\/\/nome que aparece abaixo da barra de progresso<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">progressMonitor.beginTask<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"Iniciando progresso\"<\/span><span style=\"color: #000000;\">, <\/span><span style=\"color: #990000;\">100<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">; <\/span><span style=\"color: #3f7f5f;\">\/\/nome da tarefa sendo executada (aparece como um bullet)<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>for <\/strong><\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #7f0055;\"><strong>int <\/strong><\/span><span style=\"color: #000000;\">i = <\/span><span style=\"color: #990000;\">0<\/span><span style=\"color: #000000;\">; i &lt; <\/span><span style=\"color: #990000;\">100<\/span><span style=\"color: #000000;\">; i++<\/span><span style=\"color: #000000;\">) {<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">Thread.sleep<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #990000;\">50<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">progressMonitor.worked<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #990000;\">1<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>if<\/strong><\/span><span style=\"color: #000000;\">(((<\/span><span style=\"color: #7f0055;\"><strong>int<\/strong><\/span><span style=\"color: #000000;\">)(<\/span><span style=\"color: #000000;\">Math.random<\/span><span style=\"color: #000000;\">()<\/span><span style=\"color: #000000;\">*<\/span><span style=\"color: #990000;\">100<\/span><span style=\"color: #000000;\">)) <\/span><span style=\"color: #000000;\">== <\/span><span style=\"color: #990000;\">1<\/span><span style=\"color: #000000;\">){<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #3f7f5f;\">\/\/erro aleat\u00f3rio<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>throw new <\/strong><\/span><span style=\"color: #000000;\">RuntimeException<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"Erro aleat\u00f3rio\"<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">}<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">}<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">progressMonitor.setTaskName<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"Completo!\"<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">; <\/span><span style=\"color: #3f7f5f;\">\/\/altera o nome da tarefa sendo executada (adicionando um bullet)<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">progressMonitor.subTask<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"\"<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">}<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">}<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">IProgressMonitor progressMonitor = ProgressTaskFactory.startTask<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #000000;\">tarefa<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">setAttribute<\/span><span style=\"color: #000000;\">(<\/span><span style=\"color: #2a00ff;\">\"progressMonitor\"<\/span><span style=\"color: #000000;\">, progressMonitor<\/span><span style=\"color: #000000;\">)<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #7f0055;\"><strong>return <\/strong><\/span><span style=\"color: #2a00ff;\">\"progressbar\"<\/span><span style=\"color: #000000;\">;<\/span><br \/>\n<span style=\"color: #ffffff;\"> <\/span><span style=\"color: #000000;\">}<\/span><br \/>\n<span style=\"color: #000000;\">}<\/span><\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><small><a href=\"http:\/\/www.java2html.de\" target=\"_blank\">Java2html<\/a> <\/small><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><\/p>\n<p><span style=\"font-size: x-small\"><strong><span style=\"font-size: x-small;\">JSP<\/span><\/strong><\/span><\/p>\n<p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http:\/\/www.java2html.de     = --><\/p>\n<div class=\"java\">\n<p><!-- end source code --><\/p>\n<p><!-- start Java2Html link --><\/p>\n<p><!-- end Java2Html link --><\/p>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"#ffffff\">\n<tbody>\n<tr><!-- start source code --><\/p>\n<td align=\"left\" valign=\"top\"><code><span style=\"color: #008000;\"><span style=\"color: #000000\">&lt;%<\/span><span style=\"color: #646464\">@ <\/span><span style=\"color: #000000\">taglib prefix=<\/span><span style=\"color: #2a00ff\">\"c\" <\/span><span style=\"color: #000000\">uri=<\/span><span style=\"color: #2a00ff\">\"http:\/\/java.sun.com\/jsp\/jstl\/core\"<\/span><span style=\"color: #000000\">%&gt;<\/span><br \/>\n<span style=\"color: #000000\">&lt;%<\/span><span style=\"color: #646464\">@ <\/span><span style=\"color: #000000\">taglib prefix=<\/span><span style=\"color: #2a00ff\">\"n\" <\/span><span style=\"color: #000000\">uri=<\/span><span style=\"color: #2a00ff\">\"next\"<\/span><span style=\"color: #000000\">%&gt;<\/span><br \/>\n<span style=\"color: #000000\">&lt;%<\/span><span style=\"color: #646464\">@ <\/span><span style=\"color: #000000\">taglib prefix=<\/span><span style=\"color: #2a00ff\">\"t\" <\/span><span style=\"color: #000000\">uri=<\/span><span style=\"color: #2a00ff\">\"template\"<\/span><span style=\"color: #000000\">%&gt;<\/span> <\/span><br \/>\n<span style=\"color: #ffffff\"> <\/span><br \/>\n<span style=\"color: #000000\">&lt;t:tela titulo=<\/span><span style=\"color: #2a00ff\">\"Exemplo Progress Bar\"<\/span><span style=\"color: #000000\">&gt;<\/span><br \/>\n<span style=\"color: #ffffff\"> <\/span><span style=\"color: #000000\">&lt;!-- Cria a barra de progresso e j\u00e1 inicializa o processo no servidor --&gt;<\/span><br \/>\n<span style=\"color: #ffffff\"> <\/span><span style=\"color: #000000\">&lt;n:progressBar progressMonitor=<\/span><span style=\"color: #2a00ff\">\"${progressMonitor}\"<br \/>\n<\/span><span style=\"color: #000000\"> onComplete=<\/span><span style=\"color: #2a00ff\">\"alert('Completo '+element.done);\"<br \/>\n<\/span><span style=\"color: #000000\"> onError=<\/span><span style=\"color: #2a00ff\">\"alert('Ocorreu um erro em '+element.percentDone+'%');\"<\/span><span style=\"color: #000000\">\/&gt;<\/span><br \/>\n<span style=\"color: #000000\">&lt;\/t:tela&gt;<\/span><\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><small><a href=\"http:\/\/www.java2html.de\" target=\"_blank\">Java2html<\/a> <\/small><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O Next oferece um recurso de barra de progresso atrav\u00e9s da tag &lt;n:progressbar&gt;. O programador n\u00e3o precisa lidar com as funcionalidades AJAX envolvidas nesse processo. Nesse tutorial \u00e9 mostrado um exemplo de utiliza\u00e7\u00e3o dessa tag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[34,35],"class_list":["post-416","post","type-post","status-publish","format-standard","hentry","category-tutorial","tag-ajax","tag-progressbar"],"_links":{"self":[{"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/posts\/416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/comments?post=416"}],"version-history":[{"count":7,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/posts\/416\/revisions"}],"predecessor-version":[{"id":419,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/posts\/416\/revisions\/419"}],"wp:attachment":[{"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/media?parent=416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/categories?post=416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nextframework.org\/site\/wp-json\/wp\/v2\/tags?post=416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}