{"id":4079,"date":"2017-02-08T21:25:30","date_gmt":"2017-02-08T21:25:30","guid":{"rendered":"https:\/\/www.ckl.io\/br\/?p=4079"},"modified":"2022-07-01T18:37:32","modified_gmt":"2022-07-01T18:37:32","slug":"reactivex","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/","title":{"rendered":"Como ReactiveX funciona?"},"content":{"rendered":"<p>Sendo um desenvolvedor de software mobile, eu tenho que lidar com programa\u00e7\u00e3o ass\u00edncrona diariamente. Para fornecer ao usu\u00e1rio a melhor experi\u00eancia poss\u00edvel, tarefas como&nbsp;fazer uma requisi\u00e7\u00e3o web, buscar informa\u00e7\u00f5es&nbsp;no meu banco de dados, esperar algum processo secund\u00e1rio terminar ou baixar uma imagem devem ser executas de modo ass\u00edncrono. Mesmo com alguns anos de experi\u00eancia, \u00e0s vezes eu esque\u00e7o a sintaxe para alguma chamada ass\u00edncrona. Como eu tenho que implementar o callback para esse processo? Como eu devo lidar com o erro se alguma coisa der errado?. Existem centenas de formas de lidar com essas respostas, e, como&nbsp;desenvolvedor, \u00e9 meu trabalho saber qual se encaixa melhor em cada situa\u00e7\u00e3o. A primeira vez que eu li sobre ReactiveX, eu pensei comigo mesmo: \u201c\u00d3timo, outra API ass\u00edncrona para memorizar\u2026\u201d. Eu n\u00e3o poderia estar mais enganado.<\/p>\n<p><!--more--><\/p>\n<p>A API do ReactiveX (ou Rx) padroniza todos os processos ass\u00edncronos com uma sintaxe muito simples: <code>onNext()<\/code>, <code>onError()<\/code> e <code>onCompletion()<\/code>. \u00c9 o fim da decoreba de sintaxes para lidar com aqueles callbacks que eu s\u00f3 escrevo duas vezes por ano. Sem mencionar que o c\u00f3digo fica muito mais bonito j\u00e1 que boa parte de boilerplate&nbsp;\u00e9 removido.<\/p>\n<p>Ele se baseia em tr\u00eas ideias principais: o padr\u00e3o Observador, o padr\u00e3o Iterador e programa\u00e7\u00e3o funcional. O padr\u00e3o Observador \u00e9 uma forma sensacional para lidar com tarefas ass\u00edncronas: o observable notifica todos seus receptores cada vez que um novo evento ocorre. O padr\u00e3o Iterador permite um maior desacoplamento entre o tipo do objeto e os algoritmos, permitindo que ele seja usado em um grande n\u00famero de cen\u00e1rios. Programa\u00e7\u00e3o funcional n\u00e3o s\u00f3 torna o c\u00f3digo mais conciso, mas tamb\u00e9m ajuda muito nesses cen\u00e1rios concorrentes. Essas ideias combinadas tornam ReactiveX uma \u00f3tima forma de lidar com programa\u00e7\u00e3o ass\u00edncrona.<\/p>\n<p>Ele \u00e9 uma API muito direta, depois que voc\u00ea entende como observables, observers, operators e schedulers funcionam. Vamos respirar fundo e come\u00e7ar.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-4073 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/deep-breath.gif\" alt=\"deep breath\" width=\"550\" height=\"287\"><\/p>\n<h2>Observables e observers<\/h2>\n<p>Essa parte \u00e9 bem simples: observables v\u00e3o emitir eventos, como eu mencionei antes, e alguns outros objetos (chamados de observers) v\u00e3o se inscrever a esses observables e v\u00e3o lidar com esses eventos emitidos.<br \/>\nMoleza, n\u00e3o \u00e9?<\/p>\n<h2>Operators<\/h2>\n<p>\u00c9 aqui que grande parte da magia do Rx acontece.<br \/>\nVamos supor que voc\u00ea quer reagir \u00e0s mudan\u00e7as em um campo de busca: pegar a entrada do usu\u00e1rio, criar uma requisi\u00e7\u00e3o para seu backend e apresentar os resultados da busca para o usu\u00e1rio. Voc\u00ea sabe que n\u00e3o deve reagir para cada novo caractere que o usu\u00e1rio digitar, ou um usu\u00e1rio que digita r\u00e1pido vai acabar causando muitas requisi\u00e7\u00f5es em um curto per\u00edodo de tempo, o que seria mais dif\u00edcil de lidar e adicionaria muita press\u00e3o sobre o backend. O que voc\u00ea faria nesse caso? Provavelmente criaria uma tarefa temporizada que iria checar se o campo de busca sofreu alguma mudan\u00e7a a cada poucos segundos, e se ele sofreu, enviar a requisi\u00e7\u00e3o de busca. Isso acarreta mais c\u00f3digo para lidar, e mais espa\u00e7o para erros (temporizadores s\u00e3o uma grande fonte de problemas na minha experi\u00eancia). E se eu te dissesse que ReactiveX pode lidar com tudo isso com apenas uma linha de c\u00f3digo? M\u00e1gica, certo?<br \/>\nEstou falando sobre operators agora. A maioria desses caras opera sobre um observable e retorna outro observable, permitindo que voc\u00ea encadeie m\u00faltiplos deles para obter o comportamento desejado. No exemplo do campo de busca que eu mencionei antes, um \u00fanico operator do tipo debounce teria atingido o comportamento que n\u00f3s quer\u00edamos.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-4074 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/debounce.gif\" alt=\"debounce\" width=\"1033\" height=\"356\"><\/p>\n<p>Existem operators que podem criar, transformar, filtrar, combinar observables e muito, muito mais. Voc\u00ea pode ter uma ideia boa de como us\u00e1-los <a href=\"http:\/\/reactivex.io\/documentation\/operators.html#categorized\">aqui<\/a>.<\/p>\n<h2>Schedulers<\/h2>\n<p>Esses caras me fazem querer usar Rx para todas as tarefas ass\u00edncronas que eu tenho.<br \/>\nAlguns operators especiais aceitam schedulers como um par\u00e2metro para permitir multithreading na cadeia de operators. Isso permite que o Rx comece a lidar com um evento emitido por um observable em uma thread, processe parte dele em outra thread e apresente o resultado em uma terceira thread.<\/p>\n<p><img decoding=\"async\" class=\" wp-image-4075 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/schedulers.png\" alt=\"schedulers\" width=\"518\" height=\"649\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/schedulers.png 1280w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/schedulers-768x960.png 768w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/><\/p>\n<p>Isso pode parecer com muitas threads para voc\u00ea. Mas a primeira vez que eu comecei uma requisi\u00e7\u00e3o de rede em uma thread de entrada\/sa\u00edda, processei a resposta em uma thread secund\u00e1ria e atualizei a interface na thread principal com apenas tr\u00eas operadores a mais, eu vi o qu\u00e3o inestim\u00e1veis esses schedulers s\u00e3o.<\/p>\n<h2>Eu preciso usar ReactiveX ou eu vou morrer!<\/h2>\n<p>Voc\u00ea deve estar se perguntando se pode usar ReactiveX nos seus projetos e a resposta provavelmente \u00e9 sim, porque ele foi implementado em diversas linguagens e plataformas. Confira a <a href=\"http:\/\/reactivex.io\/languages.html\">lista oficial de linguagens suportadas<\/a>. Mas n\u00e3o se desespere se voc\u00ea n\u00e3o encontrar sua linguagem ou plataforma preferia ali, provavelmente voc\u00ea pode encontrar algu\u00e9m no <a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&amp;q=rx\">github<\/a> que j\u00e1 implementou uma biblioteca para voc\u00ea.<\/p>\n<p>Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sendo um desenvolvedor de software mobile, eu tenho que lidar com programa\u00e7\u00e3o ass\u00edncrona diariamente. Para fornecer ao usu\u00e1rio a melhor experi\u00eancia poss\u00edvel, tarefas como&nbsp;fazer uma requisi\u00e7\u00e3o web, buscar informa\u00e7\u00f5es&nbsp;no meu banco de dados, esperar algum processo secund\u00e1rio terminar ou baixar uma imagem devem ser executas de modo ass\u00edncrono. Mesmo com alguns anos de experi\u00eancia, \u00e0s [&hellip;]<\/p>\n","protected":false},"author":65,"featured_media":4098,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[471,344],"tags":[],"class_list":["post-4079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engenharia","category-opiniao"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Como ReactiveX funciona? | Blog | Cheesecake Labs<\/title>\n<meta name=\"description\" content=\"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como ReactiveX funciona? | Blog | Cheesecake Labs\" \/>\n<meta property=\"og:description\" content=\"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-08T21:25:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-01T18:37:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\"},\"author\":{\"name\":\"Natan Grando\"},\"headline\":\"Como ReactiveX funciona?\",\"datePublished\":\"2017-02-08T21:25:30+00:00\",\"dateModified\":\"2022-07-01T18:37:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\"},\"wordCount\":845,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png\",\"articleSection\":[\"Engenharia\",\"Opini\u00e3o\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\",\"name\":\"Como ReactiveX funciona? | Blog | Cheesecake Labs\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png\",\"datePublished\":\"2017-02-08T21:25:30+00:00\",\"dateModified\":\"2022-07-01T18:37:32+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"Natan Grando\"},\"description\":\"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png\",\"width\":2000,\"height\":720,\"caption\":\"ReactiveX\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como ReactiveX funciona?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"name\":\"Natan Grando\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/\",\"url\":false,\"contentUrl\":false,\"caption\":\"Natan Grando\"},\"description\":\"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\/autor\/natan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como ReactiveX funciona? | Blog | Cheesecake Labs","description":"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/","og_locale":"pt_BR","og_type":"article","og_title":"Como ReactiveX funciona? | Blog | Cheesecake Labs","og_description":"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.","og_url":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2017-02-08T21:25:30+00:00","article_modified_time":"2022-07-01T18:37:32+00:00","og_image":[{"width":2000,"height":720,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png","type":"image\/png"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Escrito por":null,"Est. tempo de leitura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/"},"author":{"name":"Natan Grando"},"headline":"Como ReactiveX funciona?","datePublished":"2017-02-08T21:25:30+00:00","dateModified":"2022-07-01T18:37:32+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/"},"wordCount":845,"commentCount":0,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png","articleSection":["Engenharia","Opini\u00e3o"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/","url":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/","name":"Como ReactiveX funciona? | Blog | Cheesecake Labs","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png","datePublished":"2017-02-08T21:25:30+00:00","dateModified":"2022-07-01T18:37:32+00:00","author":{"@type":"person","name":"Natan Grando"},"description":"A API do ReactiveX padroniza todos os processos ass\u00edncronos com uma sintaxe simples. E o c\u00f3digo fica melhor j\u00e1 que boa parte de boilerplate \u00e9 removido.","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/02\/Banner_reactive6.png","width":2000,"height":720,"caption":"ReactiveX"},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/reactivex\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/br\/"},{"@type":"ListItem","position":2,"name":"Como ReactiveX funciona?"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/br\/","name":"Cheesecake Labs","description":"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","name":"Natan Grando","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/","url":false,"contentUrl":false,"caption":"Natan Grando"},"description":"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.","url":"https:\/\/cheesecakelabs.com\/blog\/br\/\/autor\/natan\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/4079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/comments?post=4079"}],"version-history":[{"count":1,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/4079\/revisions"}],"predecessor-version":[{"id":10479,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/4079\/revisions\/10479"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media\/4098"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media?parent=4079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/categories?post=4079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/tags?post=4079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}