{"id":231592,"date":"2022-12-24T12:15:00","date_gmt":"2022-12-24T09:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231592"},"modified":"2022-12-07T10:57:28","modified_gmt":"2022-12-07T07:57:28","slug":"como-estruturar-a-funcionalidade-da-api","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-estruturar-a-funcionalidade-da-api\/","title":{"rendered":"Como estruturar a funcionalidade da API"},"content":{"rendered":"\n<p>Eu n\u00e3o tenho muita experi\u00eancia quando se trata de criar APIs. Eu fiz uma boa parte do trabalho quando se trata de integrar o WordPress com APIs de terceiros, mas gastei muito pouco tempo trabalhando na cria\u00e7\u00e3o de um sistema que tenha sua API com a qual outros sistemas possam interagir.<\/p>\n<p>No que diz respeito a este \u00faltimo, estou realmente no meio de fazer isso (e estou aprendendo muito). A ess\u00eancia do projeto \u00e9 que h\u00e1 um aplicativo iOS que est\u00e1 interagindo com o WordPress por meio <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">da API REST<\/a> de maneira bidirecional.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e7069145e53.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e7069145e53.png\" alt=\"Como estruturar a funcionalidade da API\" ><\/a><\/p>\n<p>Estou ansioso para compartilhar mais sobre isso, mas preciso faz\u00ea-lo quando o projeto estiver mais avan\u00e7ado.<\/p>\n<p>Mas quando se trata de trabalhar com APIs de terceiros e, em seguida, construir componentes de um projeto WordPress que interagem com eles, duas das coisas que considero \u00fateis s\u00e3o:<\/p>\n<ul>\n<li><a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usando uma biblioteca adequada<\/a> ,<\/li>\n<li>diagrama\u00e7\u00e3o do sistema,<\/li>\n<li>separando a funcionalidade em partes.<\/li>\n<\/ul>\n<p>E os dois \u00faltimos pontos acima s\u00e3o o que estou procurando abordar neste post.<\/p>\n<h2>Como estruturar a funcionalidade da API<\/h2>\n<p>Nenhum c\u00f3digo est\u00e1 envolvido nesta postagem, mas talvez seja um guia sobre como voc\u00ea pode avan\u00e7ar em seu trabalho com a estrutura\u00e7\u00e3o da funcionalidade da API ou fazendo algo semelhante por conta pr\u00f3pria.<\/p>\n<h3>Bibliotecas de terceiros<\/h3>\n<p>Menciono isso apenas porque acho valioso reutilizar solu\u00e7\u00f5es testadas e comprovadas que foram testadas (e, portanto, usadas) em v\u00e1rios projetos.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e706951696d.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e706951696d.png\" alt=\"Como estruturar a funcionalidade da API\" ><\/a><\/p>\n<p>Guzzle \u00e9 minha biblioteca de escolha. Sim, o WordPress possui fun\u00e7\u00f5es integradas para comunica\u00e7\u00e3o com outras URLs, mas voc\u00ea pode fazer mais com o Guzzle (especialmente no que se refere aos componentes da solicita\u00e7\u00e3o) do que com o WordPress.<\/p>\n<p>Concedido, esta \u00e9 a minha opini\u00e3o, mas eu gosto de trabalhar com ela. <a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">E a documenta\u00e7\u00e3o \u00e9 s\u00f3lida<\/a>.<\/p>\n<h3>Diagramando o sistema<\/h3>\n<p>Quando voc\u00ea trabalha com integra\u00e7\u00e3o com APIs de terceiros por tempo suficiente, voc\u00ea deve se acostumar com o processo de configura\u00e7\u00e3o de como o sistema funciona. Normalmente, \u00e9 mais ou menos assim:<\/p>\n<ol>\n<li>crie um cliente de API para se conectar \u00e0 API,<\/li>\n<li>configurar as fun\u00e7\u00f5es necess\u00e1rias para fazer os pedidos que voc\u00ea precisa,<\/li>\n<li>analise a resposta,<\/li>\n<li>devolva-o ao objeto ou fun\u00e7\u00e3o original que invocou a solicita\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>Isso \u00e9 um pouco simplificado (afinal, criar o cliente da API pode ser uma tarefa por si s\u00f3), mas os pontos permanecem os mesmos (e podem n\u00e3o ser uma s\u00e9rie ruim \ud83e\udd14).<\/p>\n<p>De qualquer forma, acima de tudo, nunca \u00e9 demais diagramar o sistema. Isso \u00e9 algo que ainda fa\u00e7o porque me ajuda, de certa forma, a articular o que estou construindo e ver se h\u00e1 lacunas no fluxo de controle atrav\u00e9s do aplicativo.<\/p>\n<p>Eis por que, se n\u00e3o houver outro motivo, isso \u00e9 importante: Articular o que voc\u00ea vai fazer o ajuda a entender o que est\u00e1 fazendo e muitas vezes exp\u00f5e lacunas em seu pensamento que voc\u00ea considera certas.<\/p>\n<p>Portanto, quando se trata de projetar um sistema, n\u00e3o assuma que voc\u00ea j\u00e1 entendeu tudo.<\/p>\n<h3>Separando a funcionalidade<\/h3>\n<p>Se voc\u00ea l\u00ea este blog h\u00e1 algum tempo, sabe que sou f\u00e3 de seguir todas as ideias de desenvolvimento de &#8220;separa\u00e7\u00e3o de interesses&quot;.<\/p>\n<p>Isso \u00e9 verdade por v\u00e1rios motivos, dos quais menos n\u00e3o s\u00e3o:<\/p>\n<ul>\n<li>ser capaz de testar a unidade de um cliente de API isoladamente,<\/li>\n<li>mantendo o c\u00f3digo para comunica\u00e7\u00e3o com o front-end e o back-end independente.<\/li>\n<\/ul>\n<p>Quando voc\u00ea tem uma classe dedicada \u00e0 execu\u00e7\u00e3o da l\u00f3gica de neg\u00f3cios nos valores, pode descarregar grande parte do tratamento de erros na classe intermedi\u00e1ria.<\/p>\n<p>Isso significa que a classe principal respons\u00e1vel pela maior parte da l\u00f3gica de neg\u00f3cios deve ter exatamente o que precisa para fazer seu trabalho. Isso n\u00e3o significa que n\u00e3o deve haver alguma verifica\u00e7\u00e3o de erros (divis\u00e3o por zero ou algo assim, sabe?), mas significa que os dados podem ser verificados antes mesmo de chegarem \u00e0 classe principal por meio da classe intermedi\u00e1ria.<\/p>\n<p>E n\u00e3o apenas pode verificar qualquer informa\u00e7\u00e3o ausente, mas tamb\u00e9m pode relatar esses erros de volta ao front-end.<\/p>\n<h2>Tr\u00eas pontos a serem lembrados<\/h2>\n<p>Se voc\u00ea est\u00e1 criando um sistema baseado em Ajax no WordPress, o objetivo de tudo isso \u00e9 triplo:<\/p>\n<ol>\n<li>diagramar o sistema que voc\u00ea est\u00e1 criando,<\/li>\n<li>criar uma classe intersticial para lidar com informa\u00e7\u00f5es ausentes e relatar os erros de volta,<\/li>\n<li>s\u00f3 envie as informa\u00e7\u00f5es completas para a classe de neg\u00f3cios principal depois que todas as informa\u00e7\u00f5es forem verificadas.<\/li>\n<\/ol>\n<p>Feito isso, o objetivo seria fazer com que a classe de neg\u00f3cios principal retornasse os valores solicitados sem erros, pois eles seriam capturados antes mesmo de alcan\u00e7\u00e1-los.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um guia sobre como voc\u00ea pode avan\u00e7ar em seu trabalho estruturando a funcionalidade da API ou fazendo algo semelhante em seu pr\u00f3prio pa\u00eds.<\/p>\n","protected":false},"author":1,"featured_media":224405,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846,867],"tags":[1170],"class_list":["post-231592","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231592"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231592\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224405"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}