{"id":148,"date":"2024-07-20T17:23:39","date_gmt":"2024-07-20T20:23:39","guid":{"rendered":"https:\/\/alice.com.br\/tech\/sem-categoria\/json-como-integrar-back-end-e-front-end-com-padroes-diferentes\/"},"modified":"2026-01-19T22:36:30","modified_gmt":"2026-01-20T01:36:30","slug":"json-como-integrar-back-end-e-front-end-com-padroes-diferentes","status":"publish","type":"post","link":"https:\/\/alice.com.br\/tech\/json-como-integrar-back-end-e-front-end-com-padroes-diferentes\/","title":{"rendered":"JSON: integrando Back-end e Front-end na pr\u00e1tica"},"content":{"rendered":"<h3>O Problema<\/h3>\n<p>Como padr\u00e3o, no Javascript utilizamos o <strong>camelCase <\/strong>para nomenclatura de vari\u00e1veis \u200b\u200be fun\u00e7\u00f5es, e \u00e9 poss\u00edvel encontrar essa defini\u00e7\u00e3o nos principais guias de estilo de JS, como o <a href=\"https:\/\/standardjs.com\/rules.html\">standardjs<\/a> ou o <a href=\"https:\/\/github.com\/airbnb\/javascript#naming--camelCase\">airbnb<\/a>. E aqui na <a href=\"https:\/\/alice.com.br\/carreiras\">Alice<\/a>, n\u00f3s tamb\u00e9m seguimos esse padr\u00e3o para os projetos de Front-end.<\/p>\n<p>Uma das <a href=\"https:\/\/medium.com\/alice-tech\/como-tomamos-decis%C3%B5es-860121def07f\">decis\u00f5es que tomamos<\/a> ao definir o padr\u00e3o para nossas APIs \u00e9 que usar\u00edamos JSON com <strong>snake_case <\/strong>pois consideramos que para a leitura de logs por humanos, esse formato \u00e9 mais leg\u00edvel do que <strong>camelCase<\/strong>. No nosso Back-end, feito em <a href=\"https:\/\/kotlinlang.org\/\">Kotlin<\/a>, utilizamos a biblioteca em java, <a href=\"https:\/\/github.com\/google\/gson\">GSON<\/a>. Ela transforma os objetos JAVA em uma representa\u00e7\u00e3o em JSON e vice-versa. Para que a serializa\u00e7\u00e3o\/deserializa\u00e7\u00e3o funcionasse com <strong>snake_case<\/strong> foi necess\u00e1rio passar o par\u00e2metro <em>FieldNamingPolicy<\/em> com o valor <em>LOWER_CASE_WITH_UNDERSCORES <\/em>na configura\u00e7\u00e3o do client do GSON. (Imagem\u00a0abaixo)<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/840\/1*8xkzcdPXNLHMqnJOgwI2dw.png\" alt=\"\" \/><\/figure>\n<p>Dessa forma ficamos com o padr\u00e3o <strong>snake_case<\/strong> no Back-end em todas as nossas APIs e <strong>camelCase<\/strong> em todos os projetos de Front-end, ou seja, o corpo de nossas requisi\u00e7\u00f5es e respostas HTTP s\u00e3o formados por um <strong>JSON com padr\u00e3o snake_case<\/strong>.<\/p>\n<p>Com isso temos o seguinte problema: Como utilizar <strong>camelCase<\/strong> no Front-end, sendo que todas as solicita\u00e7\u00e3o para as nossas APIs HTTP teriam que ser feitas com <strong>snake_case<\/strong>?<\/p>\n<h3>A Solu\u00e7\u00e3o<\/h3>\n<p>Para realizar nossas chamadas HTTP no Front-end, utilizamos a <a href=\"https:\/\/github.com\/sindresorhus\/ky\">biblioteca ky<\/a> ( ), que adiciona algumas funcionalidades da <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/API\/Fetch_API\">fetch API<\/a>, entre elas, os <a href=\"https:\/\/github.com\/sindresorhus\/ky#hooks\">hooks<\/a> que permitem modifica\u00e7\u00f5es da requisi\u00e7\u00e3o e de seu <em>payload<\/em> durante o ciclo de vida dessa\u00a0chamada.<\/p>\n<p>Conseguimos ent\u00e3o, resolver esse problema criando um conversor, antes das requisi\u00e7\u00f5es e ap\u00f3s as respostas, utilizando os hooks <strong>beforeRequest<\/strong> (que permite modificar a requisi\u00e7\u00e3o antes dela ser enviada) e <strong>afterResponse <\/strong>(que permite alterar a resposta da requisi\u00e7\u00e3o):<\/p>\n<ul>\n<li><strong>beforeRequest: <\/strong>Vamos converter o corpo da nossa requisi\u00e7\u00e3o de <strong>camelCase<\/strong> para <strong>snake_case<\/strong><em>.<\/em><\/li>\n<li><strong>afterResponse: <\/strong>Vamos converter o corpo da nossa resposta de <strong>snake_case<\/strong> para <strong>camelCase<\/strong><em>.<\/em><\/li>\n<\/ul>\n<p>O c\u00f3digo JS ficaria da seguinte\u00a0forma:<\/p>\n<p><iframe loading=\"lazy\" src=\"\" width=\"0\" height=\"0\" frameborder=\"0\" scrolling=\"no\"><a href=\"https:\/\/medium.com\/media\/c6890799daa387f4bc862d605eae4e86\/href\">https:\/\/medium.com\/media\/c6890799daa387f4bc862d605eae4e86\/href<\/a><\/iframe><\/p>\n<h3>Esse c\u00f3digo \u00e9 open\u00a0source<\/h3>\n<p>Criamos um pacote para permitir essa e outras altera\u00e7\u00f5es de <em>case <\/em>em nossas requisi\u00e7\u00f5es, e decidimos abrir o c\u00f3digo dessa\u00a0solu\u00e7\u00e3o:<\/p>\n<p><a href=\"https:\/\/github.com\/alice-health\/ky-hooks-change-case\">alice-health\/ky-hooks-change-case<\/a><\/p>\n<p>Inclusive, esse pacote foi adicionado como biblioteca relacionada no <a href=\"https:\/\/github.com\/sindresorhus\/ky#related\">reposit\u00f3rio oficial do KY<\/a>. Sinta-se a vontade para abrir <em>pull requests<\/em> com melhorias, corre\u00e7\u00f5es ou mandar qualquer coment\u00e1rio. J\u00e1 utilizou o <em>ky <\/em>e\/ou<em> hooks<\/em> para outros casos de uso? Compartilhe com a gente aqui nos coment\u00e1rios quais\u00a0 .<\/p>\n<p>Kudos e agradecimentos \u00e0 <a href=\"https:\/\/medium.com\/u\/da63b77d6dcb\">Diego Leme<\/a> pela contribui\u00e7\u00e3o na biblioteca e in\u00edcio desse\u00a0post.<\/p>\n<h3>Que tal fazer parte desse\u00a0time?<\/h3>\n<p>Estamos buscando pessoas que topem o desafio de transformar a sa\u00fade no Brasil atrav\u00e9s da tecnologia. <a href=\"https:\/\/www.alice.com.br\/carreiras\">Clica aqui<\/a> para saber mais das vagas que temos em\u00a0aberto!<\/p>\n","protected":false},"excerpt":{"rendered":"Como padr\u00e3o, no Javascript utilizamos o camelCase para nomenclatura de vari\u00e1veis \u200b\u200be fun\u00e7\u00f5es. E aqui na Alice, n\u00f3s tamb\u00e9m seguimos esse padr\u00e3o para os projetos de Front-end.","protected":false},"author":3,"featured_media":172,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"acf":[],"_links":{"self":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/comments?post=148"}],"version-history":[{"count":5,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/148\/revisions"}],"predecessor-version":[{"id":253,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/148\/revisions\/253"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media\/172"}],"wp:attachment":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media?parent=148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/categories?post=148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/tags?post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}