{"id":38022,"date":"2019-10-31T22:21:14","date_gmt":"2019-10-31T19:21:14","guid":{"rendered":"https:\/\/prohoster.info\/blog\/tak-vse-taki-raml-ili-oas-swagger\/"},"modified":"2019-10-31T22:21:14","modified_gmt":"2019-10-31T19:21:14","slug":"tak-vse-taki-raml-ili-oas-swagger","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","title":{"rendered":"Ent\u00e3o, RAML ou OAS (Swagger)?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Em um mundo din\u00e2mico de microsservi\u00e7os, tudo pode mudar \u2014 qualquer componente pode ser reescrito em outra linguagem, utilizando diferentes frameworks e arquiteturas. Apenas os contratos devem permanecer imut\u00e1veis, para que a intera\u00e7\u00e3o com o microsservi\u00e7o possa ocorrer de forma consistente do exterior, independentemente das metamorfoses internas. Hoje, iremos falar sobre nosso dilema na escolha do formato de descri\u00e7\u00e3o dos contratos e compartilhar os artefatos encontrados. <\/p>\n<p><img decoding=\"async\" alt=\"Ent\u00e3o, RAML ou OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/00864185e0f8032a304049ebf21eab21.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPost elaborado por <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annatref\/\">Anna Melekhova<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/vlapat\/\">Vladimir Lapatin<\/a><\/noindex> <\/p>\n<p><b>Microsservi\u00e7os.<\/b> Durante o desenvolvimento do Acronis Cyber Cloud, percebemos que n\u00e3o poder\u00edamos evitar isso. E o design de um microsservi\u00e7o \u00e9 imposs\u00edvel sem a formaliza\u00e7\u00e3o do contrato, que representa a interface do microsservi\u00e7o.<\/p>\n<p>Mas quando um produto cont\u00e9m mais de um componente, e o desenvolvimento do contrato se torna uma atividade regular, voc\u00ea come\u00e7a a pensar na otimiza\u00e7\u00e3o do processo. Torna-se evidente que a interface (contrato) e a implementa\u00e7\u00e3o (microsservi\u00e7o) devem corresponder uma \u00e0 outra, que diferentes componentes devem realizar as mesmas fun\u00e7\u00f5es de maneira uniforme, e que sem uma entrega centralizada de todas essas decis\u00f5es, cada equipe precisar\u00e1, repetidamente, reinvestir tempo para obt\u00ea-las. <\/p>\n<p><img decoding=\"async\" alt=\"Ent\u00e3o, RAML ou OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/48048d36536f02a3a71821e7f6f32a17.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Esquema de microsservi\u00e7os da Amazon de <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/werner\/status\/741673514567143424\">um tweet<\/a><\/noindex> de Werner Vogels, CTO da Amazon<\/i><br \/>\nQual \u00e9, ent\u00e3o, o dilema? De fato, existem duas maneiras de os microsservi\u00e7os interagirem - HTTP Rest e gRPC da Google. N\u00e3o desejando ser envolvido na stack de tecnologias da Google, escolhemos HTTP Rest. Anota\u00e7\u00f5es de contratos HTTP REST geralmente s\u00e3o descritas em um dos dois formatos: RAML e OAS, anteriormente conhecido como Swagger. Portanto, cada equipe de desenvolvimento enfrenta a necessidade de escolher um dos padr\u00f5es. Mas, como se revelou, fazer essa escolha pode ser bastante desafiador.<\/p>\n<h3>Por que s\u00e3o necess\u00e1rias anota\u00e7\u00f5es?<\/h3>\n<p>\nA anota\u00e7\u00e3o \u00e9 necess\u00e1ria para que um usu\u00e1rio externo consiga entender facilmente o que pode ser feito com seu servi\u00e7o atrav\u00e9s da interface HTTP. Ou seja, em um n\u00edvel b\u00e1sico, a anota\u00e7\u00e3o deve conter pelo menos uma lista de recursos dispon\u00edveis, seus m\u00e9todos HTTP, corpos de solicita\u00e7\u00f5es, enumera\u00e7\u00e3o de par\u00e2metros, indica\u00e7\u00e3o de cabe\u00e7alhos necess\u00e1rios e suportados, bem como c\u00f3digos de retorno e formatos de resposta. Um elemento extremamente importante da anota\u00e7\u00e3o do contrato \u00e9 a descri\u00e7\u00e3o verbal deles (\u201co que acontecer\u00e1 se esse query-par\u00e2metro for adicionado \u00e0 solicita\u00e7\u00e3o?\u201d, \u201cem qual caso retornar\u00e1 o c\u00f3digo 400?\u201d)<\/p>\n<p>No entanto, quando se trata de desenvolver um grande n\u00famero de microsservi\u00e7os, \u00e9 desej\u00e1vel extrair mais benef\u00edcios das anota\u00e7\u00f5es escritas. Por exemplo, com base no RAML\/Swagger, \u00e9 poss\u00edvel gerar tanto c\u00f3digo cliente quanto servidor em uma enorme variedade de linguagens de programa\u00e7\u00e3o. Al\u00e9m disso, \u00e9 poss\u00edvel obter automaticamente a documenta\u00e7\u00e3o do microsservi\u00e7o e public\u00e1-la em seu portal de desenvolvedores :).<\/p>\n<p><img decoding=\"async\" alt=\"Ent\u00e3o, RAML ou OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/0c71fb27949bdde82172c58d0c95c432.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Exemplo de descri\u00e7\u00e3o estruturada de contrato<\/i><\/p>\n<p>\u00c9 menos comum a pr\u00e1tica de testar microsservi\u00e7os com base nas descri\u00e7\u00f5es dos contratos. Se voc\u00ea escreveu tanto a anota\u00e7\u00e3o quanto o componente, pode criar um autoteste que verifique a adequa\u00e7\u00e3o do funcionamento do servi\u00e7o com diferentes tipos de dados de entrada. O servi\u00e7o retorna algum c\u00f3digo de resposta que n\u00e3o est\u00e1 descrito na anota\u00e7\u00e3o? Ele consegue processar corretamente dados deliberadamente inv\u00e1lidos?<\/p>\n<p>Al\u00e9m disso, uma implementa\u00e7\u00e3o de qualidade n\u00e3o apenas dos pr\u00f3prios contratos, mas tamb\u00e9m de ferramentas para visualiza\u00e7\u00e3o de anota\u00e7\u00f5es pode simplificar o trabalho com o microsservi\u00e7o. Ou seja, se o arquiteto descreveu o contrato com qualidade, com base nele, os designers e desenvolvedores poder\u00e3o integrar o servi\u00e7o em outros produtos sem custos de tempo adicionais.<\/p>\n<p>Para o funcionamento de ferramentas adicionais, tanto o RAML quanto o OAS t\u00eam a capacidade de adicionar metadados n\u00e3o previstos pelo padr\u00e3o (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\/blob\/master\/versions\/3.0.0.md#specification-extensions\">por exemplo, assim \u00e9 feito no OAS<\/a><\/noindex>).<\/p>\n<p>Em geral, h\u00e1 um grande espa\u00e7o para criatividade na aplica\u00e7\u00e3o de contratos para microsservi\u00e7os\u2026 pelo menos teoricamente<\/p>\n<h3>Compara\u00e7\u00e3o de um ouri\u00e7o com uma cobra<\/h3>\n<p>\nAtualmente, a principal linha de desenvolvimento na Acronis \u00e9 a evolu\u00e7\u00e3o da Acronis Cyber Platform. A Acronis Cyber Platform \u00e9 uma nova interface de integra\u00e7\u00e3o de servi\u00e7os de terceiros com a Acronis Cyber Cloud e com a parte de ag\u00eancia. Embora nossas APIs internas, descritas em RAML, estivessem funcionando bem para n\u00f3s, a necessidade de publicar a API levantou novamente a quest\u00e3o da escolha: qual padr\u00e3o de anota\u00e7\u00f5es \u00e9 melhor para o nosso trabalho?<\/p>\n<p>Inicialmente, parecia que havia duas solu\u00e7\u00f5es \u2014 as mais comuns, RAML e Swagger (ou OAS). Mas, na pr\u00e1tica, n\u00e3o se tratava de apenas duas alternativas, mas sim de tr\u00eas ou mais.<\/p>\n<p>De um lado, temos o RAML \u2014 uma linguagem poderosa e eficiente. Ele implementa bem hierarquias e heran\u00e7as, tornando esse formato mais adequado para grandes empresas que precisam de muitas descri\u00e7\u00f5es \u2014 ou seja, n\u00e3o um produto, mas muitos microservi\u00e7os que possuem partes comuns nos contratos \u2014 esquemas de autentica\u00e7\u00e3o, tipos de dados id\u00eanticos, corpos de erro.<\/p>\n<p>Mas o desenvolvedor do RAML, a empresa Mulesoft, se juntou ao cons\u00f3rcio Open API, que est\u00e1 focado no desenvolvimento do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.google.com\/url?q=https:\/\/swagger.io\/blog\/news\/mulesoft-joins-the-open-api-initiative\/&amp;sa=D&amp;ust=1568012015646000&amp;usg=AFQjCNExaO-_GkMnfmqc_MRu6mgHYgjK-A\">Swagger<\/a><\/noindex>. Portanto, o desenvolvimento do RAML foi suspenso. Para imaginar a situa\u00e7\u00e3o do formato, considere que os mantenedores dos componentes principais do Linux foram trabalhar na Microsoft. Essa situa\u00e7\u00e3o gera condi\u00e7\u00f5es para o uso do Swagger, que est\u00e1 em desenvolvimento din\u00e2mico e, na sua \u00faltima \u2014 terceira vers\u00e3o \u2014 est\u00e1 praticamente alcan\u00e7ando o RAML em flexibilidade e funcionalidade.<\/p>\n<h3>Se n\u00e3o fosse por um pequeno detalhe...<\/h3>\n<p>\nComo se viu, nem todas as utilidades de c\u00f3digo aberto foram atualizadas para a vers\u00e3o OAS 3.0. Para microservi\u00e7os em Go, a falta de adapta\u00e7\u00e3o do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-swagger\/go-swagger\">go-swagger<\/a><\/noindex> para a nova vers\u00e3o do padr\u00e3o ser\u00e1 extremamente cr\u00edtica. No entanto, a diferen\u00e7a entre o Swagger 2 e o Swagger 3 \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/swagger.io\/blog\/news\/whats-new-in-openapi-3-0\/\">enorme.<\/a><\/noindex>Por exemplo, na terceira vers\u00e3o, os desenvolvedores:<\/p>\n<ul>\n<li>melhoraram a descri\u00e7\u00e3o dos esquemas de autentica\u00e7\u00e3o,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swagger-api\/swagger-ui\/issues\/4819#issuecomment-413890929\">completaram<\/a><\/noindex> o suporte ao JSON Schema,<\/li>\n<li>melhoraram a capacidade de adicionar exemplos.<\/li>\n<\/ul>\n<p>\nA situa\u00e7\u00e3o \u00e9 curiosa: ao escolher um padr\u00e3o, devemos considerar o RAML, o Swagger 2 e o Swagger 3 como alternativas distintas. E somente o Swagger 2 possui um bom suporte de ferramentas OpenSource. O RAML \u00e9 muito flex\u00edvel\u2026 e complexo, enquanto o Swagger 3 \u00e9 pouco apoiado pela comunidade, ent\u00e3o voc\u00ea ter\u00e1 que usar ferramentas de desenvolvimento pr\u00f3prio ou solu\u00e7\u00f5es comerciais, que geralmente t\u00eam um custo bastante elevado. <\/p>\n<p>Ao mesmo tempo, se no Swagger existem muitas possibilidades agrad\u00e1veis, como um portal pronto, <noindex><a rel=\"nofollow\" href=\"https:\/\/editor.swagger.io\">editor.swagger.io<\/a><\/noindex>, onde voc\u00ea pode fazer upload de uma anota\u00e7\u00e3o e obter sua visualiza\u00e7\u00e3o com uma descri\u00e7\u00e3o detalhada, links e rela\u00e7\u00f5es, enquanto para o RAML, que \u00e9 mais fundamental e menos amig\u00e1vel, essa possibilidade n\u00e3o existe. Sim, pode-se procurar algum projeto no GitHub, encontrar um an\u00e1logo e implant\u00e1-lo manualmente. No entanto, de qualquer forma, algu\u00e9m precisar\u00e1 manter o portal, o que n\u00e3o \u00e9 t\u00e3o conveniente para uso b\u00e1sico ou necessidades de teste. Al\u00e9m disso, o swagger \u00e9 mais \"sem princ\u00edpios\", ou liberal \u2014 pode ser gerado de coment\u00e1rios no c\u00f3digo, o que, claro, vai contra o princ\u00edpio do API first e n\u00e3o \u00e9 suportado por nenhuma das utilidades RAML.<\/p>\n<p>No nosso tempo, come\u00e7amos a trabalhar com RAML, por ser uma linguagem mais flex\u00edvel, e acabamos fazendo muitas coisas manualmente. Por exemplo, em um dos projetos, usamos uma ferramenta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spotify\/ramlfications\">ramlfications<\/a><\/noindex> em testes de unidade, que suporta apenas RAML 0.8. Portanto, tivemos que adicionar gambiarras para que a ferramenta pudesse \"processar\" RAML na vers\u00e3o 1.0.<\/p>\n<h3>E precisamos escolher?<\/h3>\n<p>\nAp\u00f3s nos familiarizarmos com a adi\u00e7\u00e3o de uma ecossistema de solu\u00e7\u00f5es para RAML, chegamos \u00e0 conclus\u00e3o de que precis\u00e1vamos converter RAML para Swagger 2 e realizar toda a automa\u00e7\u00e3o, verifica\u00e7\u00e3o, testes e posterior otimiza\u00e7\u00e3o nele. Essa \u00e9 uma boa forma de usar tanto a flexibilidade do RAML quanto o suporte da comunidade para as ferramentas do Swagger. <\/p>\n<p>Para resolver essa tarefa, existem duas ferramentas OpenSource que devem garantir a convers\u00e3o de contratos:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mulesoft\/oas-raml-converter\">oas-raml-converter<\/a><\/noindex> \u2014 uma ferramenta atualmente n\u00e3o suportada. Ao trabalhar com ela, descobrimos que surgem uma s\u00e9rie de problemas com RAMLs complexos que est\u00e3o \"distribu\u00eddos\" por muitos arquivos. Este programa \u00e9 escrito em JavaScript e realiza uma travessia recursiva da \u00e1rvore de sintaxe. Devido \u00e0 tipagem din\u00e2mica, torna-se complicado entender esse c\u00f3digo, ent\u00e3o decidimos n\u00e3o perder tempo escrevendo patches para uma ferramenta em decl\u00ednio.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/raml-org\/webapi-parser\">webapi-parser<\/a><\/noindex> \u2014 uma ferramenta da mesma empresa, que se prop\u00f5e a converter tudo e qualquer coisa, em qualquer dire\u00e7\u00e3o. At\u00e9 o momento, o suporte declarado \u00e9 para RAML 0.8, RAML 1.0 e Swagger 2.0. No entanto, no momento da nossa pesquisa, a ferramenta ainda estava <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aml-org\/amf\/issues\/517\">EXTREMAMENTE<\/a><\/noindex> crua e impr\u00f3pria para uso. Os desenvolvedores est\u00e3o criando uma esp\u00e9cie de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Intermediate_representation\">IR<\/a><\/noindex>, o que permitir\u00e1 que eles adicionem rapidamente novos padr\u00f5es no futuro. Mas por enquanto, tudo isso simplesmente n\u00e3o funciona.<\/li>\n<\/ol>\n<p>\nE isso n\u00e3o s\u00e3o todas as dificuldades que enfrentamos. Um dos passos do nosso pipeline \u00e9 verificar se o RAML do reposit\u00f3rio \u00e9 v\u00e1lido em rela\u00e7\u00e3o \u00e0 especifica\u00e7\u00e3o. Experimentamos v\u00e1rias ferramentas. Curiosamente, todas reclamaram das nossas anota\u00e7\u00f5es em diferentes lugares e com palavras bastante negativas. E, surpreendentemente, nem sempre era pertinente :).<\/p>\n<p>No final, optamos por um projeto atualmente desatualizado, que tamb\u00e9m apresenta uma s\u00e9rie de problemas (\u00e0s vezes ele falha sem motivos claros, tem dificuldades ao trabalhar com express\u00f5es regulares). Assim, n\u00e3o encontramos uma maneira de resolver os problemas de valida\u00e7\u00e3o e convers\u00e3o usando ferramentas gratuitas, e decidimos utilizar uma ferramenta comercial. No futuro, quando os recursos OpenSource se tornarem mais desenvolvidos, a solu\u00e7\u00e3o para essa tarefa pode se tornar mais f\u00e1cil. Mas, por enquanto, o custo em tempo e esfor\u00e7o para 'ajustar' parecia ser mais significativo do que o pre\u00e7o do servi\u00e7o comercial.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>\nDepois de tudo isso, sentimos a necessidade de compartilhar a experi\u00eancia e observar que, antes de escolher uma ferramenta para descrever contratos, \u00e9 preciso definir claramente o que voc\u00ea espera dela e qual or\u00e7amento est\u00e1 disposto a investir. Se ignorar o OpenSource, j\u00e1 existem muitos servi\u00e7os e produtos que podem ajudar a realizar a verifica\u00e7\u00e3o, converter e validar. Mas eles s\u00e3o caros e, \u00e0s vezes, muito caros. Para uma grande empresa, esses custos s\u00e3o toler\u00e1veis, mas para uma startup podem se tornar um grande fardo.<\/p>\n<p>Defina um conjunto de ferramentas que voc\u00ea usar\u00e1 posteriormente. Por exemplo, se voc\u00ea apenas precisa exibir um contrato, ser\u00e1 mais f\u00e1cil usar o Swagger 2, que possui uma API bonita, enquanto no RAML voc\u00ea ter\u00e1 que configurar e manter o servi\u00e7o por conta pr\u00f3pria.<br \/>\nQuanto mais tarefas voc\u00ea tiver, maior ser\u00e1 a necessidade de ferramentas, e eles s\u00e3o diferentes para diferentes plataformas. \u00c9 melhor se familiarizar desde j\u00e1 com as vers\u00f5es dispon\u00edveis, para fazer uma escolha que minimize seus custos no futuro.<\/p>\n<p>Mas \u00e9 preciso reconhecer que todos os ecossistemas existentes hoje s\u00e3o imperfeitos. Portanto, se houver f\u00e3s na empresa que adoram trabalhar com RAML, porque \"ele permite expressar ideias de forma mais flex\u00edvel\", ou, ao contr\u00e1rio, preferem Swagger porque \"\u00e9 mais compreens\u00edvel\" \u2014 \u00e9 melhor deix\u00e1-los trabalhar com aquilo que est\u00e3o acostumados e querem, pois as ferramentas de qualquer um dos formatos precisam de ajustes. <\/p>\n<p>Quanto \u00e0 nossa experi\u00eancia, em posts futuros falaremos sobre quais \u2014 verifica\u00e7\u00f5es est\u00e1ticas e din\u00e2micas realizamos com base na nossa arquitetura RAML-Swagger, assim como sobre a documenta\u00e7\u00e3o que geramos a partir dos contratos e como tudo isso funciona.<\/p>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">E qual linguagem voc\u00ea usa para anota\u00e7\u00f5es de contratos de microsservi\u00e7os?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    RAML 0.8<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    RAML 1.0<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Swagger 2<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    OAS3 (tamb\u00e9m conhecido como )<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Blueprint<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Outro<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    N\u00e3o utilizo<\/p>\n<\/li>\n<\/ul>\n<p>    Votaram 100 usu\u00e1rios. 24 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/acronis\/blog\/466691\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u0432\u043d\u0435 \u043d\u0430 \u043d\u0435\u043a\u043e\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043c\u0435\u0442\u0430\u043c\u043e\u0440\u0444\u043e\u0437. \u0418 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28540,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38022","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0430\u043a \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 RAML \u0438\u043b\u0438 OAS (Swagger)? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:21:14+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:21:14+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ent\u00e3o, afinal, RAML ou OAS (Swagger)? | ProHoster","description":"Em um mundo din\u00e2mico de microsservi\u00e7os, tudo pode mudar \u2014 qualquer componente pode ser reescrito em outra linguagem, utilizando diferentes frameworks e arquiteturas.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0430\u043a \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 RAML \u0438\u043b\u0438 OAS (Swagger)? | ProHoster","og:description":"\u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:21:14+00:00","article:modified_time":"2019-10-31T19:21:14+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38022","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 20:09:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:43:20","updated":"2026-01-23 20:09:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/38022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=38022"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/38022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/28540"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=38022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=38022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=38022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}