{"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\/it\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","title":{"rendered":"Ma quindi RAML o OAS (Swagger)?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nel dinamico mondo dei microservizi, tutto pu\u00f2 cambiare \u2014 qualsiasi componente pu\u00f2 essere riscritto in un altro linguaggio, utilizzando framework e architetture diversi. Ci\u00f2 che deve rimanere invariato sono solo i contratti, affinch\u00e9 sia possibile interagire con il microservizio dall'esterno su una base costante, indipendentemente dalle metamorfosi interne. Oggi parleremo del nostro dilemma nella scelta del formato di descrizione dei contratti e condivideremo gli artefatti trovati. <\/p>\n<p><img decoding=\"async\" alt=\"Ma quindi RAML o 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 preparato da <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>Microservizi.<\/b> Nello sviluppo di Acronis Cyber Cloud abbiamo capito che non possiamo fare a meno dei microservizi. La progettazione di un microservizio \u00e8 impossibile senza la formalizzazione di un contratto, che rappresenta l'interfaccia del microservizio.<\/p>\n<p>Tuttavia, quando un prodotto contiene pi\u00f9 di un componente e lo sviluppo del contratto diventa un'attivit\u00e0 regolare, ci si inizia a chiedere come ottimizzare il processo. Diventa evidente che l'interfaccia (contratto) e l'implementazione (microservizio) devono corrispondere, che diversi componenti devono svolgere le stesse funzioni in modo uniforme e che, senza una centralizzazione di tutte queste decisioni, ogni squadra si trover\u00e0 a spendere tempo ripetutamente per ottenerle. <\/p>\n<p><img decoding=\"async\" alt=\"Ma quindi RAML o OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/48048d36536f02a3a71821e7f6f32a17.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Schema dei microservizi di Amazon da <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/werner\/status\/741673514567143424\">un tweet<\/a><\/noindex> di Werner Vogels, CTO di Amazon<\/i><br \/>\nQual \u00e8 dunque il dilemma? De facto ci sono due modi di interazione tra microservizi \u2013 HTTP Rest e gRPC di Google. Non volendo essere coinvolti nel stack tecnologico di Google, abbiamo scelto HTTP Rest. Le annotazioni sui contratti HTTP REST sono per lo pi\u00f9 descritte in uno dei due formati: RAML e OAS, precedentemente noto come Swagger. Pertanto, ogni squadra di sviluppo si trova di fronte alla necessit\u00e0 di scegliere uno degli standard. Ma, come \u00e8 emerso, effettuare questa scelta pu\u00f2 rivelarsi molto difficile.<\/p>\n<h3>A cosa servono le annotazioni?<\/h3>\n<p>\nL'annotazione \u00e8 necessaria affinch\u00e9 l'utente esterno possa facilmente comprendere cosa si pu\u00f2 fare con il proprio servizio attraverso la sua interfaccia HTTP. Cio\u00e8, a un livello di base, l'annotazione dovrebbe contenere almeno un elenco delle risorse disponibili, i relativi metodi HTTP, i corpi delle richieste, l'elenco dei parametri, l'indicazione degli header necessari e supportati, nonch\u00e9 i codici di risposta e i formati delle risposte. Un elemento estremamente importante dell'annotazione del contratto \u00e8 anche la loro descrizione verbale (\u201ccosa succede se si aggiunge questo query-parameter alla richiesta?\u201d, \u201cin quale caso verr\u00e0 restituito il codice 400?\u201d)<\/p>\n<p>Tuttavia, quando si tratta di sviluppare un gran numero di microservizi, si desidera estrarre ulteriore valore dalle annotazioni scritte. Ad esempio, sulla base di RAML\/Swagger, \u00e8 possibile generare sia codice client che server in un'enorme variet\u00e0 di linguaggi di programmazione. Inoltre \u00e8 possibile ottenere automaticamente la documentazione per il microservizio e caricarla sul proprio developer-portal :).<\/p>\n<p><img decoding=\"async\" alt=\"Ma quindi RAML o OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/0c71fb27949bdde82172c58d0c95c432.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Esempio di descrizione strutturata del contratto<\/i><\/p>\n<p>Raramente si incontra la pratica di testare i microservizi sulla base delle descrizioni dei contratti. Se hai scritto sia l'annotazione che il componente, puoi creare un test automatico che verifica l'adeguatezza del funzionamento del servizio con diversi tipi di dati in ingresso. Il servizio restituisce un codice di risposta non descritto nell'annotazione? Sar\u00e0 in grado di gestire correttamente dati palesemente errati?<\/p>\n<p>Inoltre, una realizzazione di qualit\u00e0 non solo dei contratti stessi, ma anche degli strumenti per visualizzare le annotazioni consente di semplificare il lavoro con il microservizio. Cio\u00e8, se l'architetto ha descritto accuratamente il contratto, sulla base di esso, designer e sviluppatori potranno implementare il servizio in altri prodotti senza costi di tempo aggiuntivi.<\/p>\n<p>Per il funzionamento di strumenti aggiuntivi, sia RAML che OAS hanno la possibilit\u00e0 di aggiungere metadati non previsti dallo standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\/blob\/master\/versions\/3.0.0.md#specification-extensions\">per esempio, cos\u00ec facendo in OAS<\/a><\/noindex>).<\/p>\n<p>In generale, il campo per la creativit\u00e0 nell'applicazione dei contratti ai microservizi \u00e8 enorme\u2026 almeno teoricamente<\/p>\n<h3>Confronto tra una lucertola e un riccio<\/h3>\n<p>\nAttualmente, la principale direzione di sviluppo in Acronis \u00e8 l'evoluzione di Acronis Cyber Platform. Acronis Cyber Platform rappresenta nuovi punti di integrazione di servizi di terze parti con Acronis Cyber Cloud e la parte agent. Anche se le nostre API interne, descritte in RAML, ci soddisfacevano, la necessit\u00e0 di pubblicare l'API ha di nuovo sollevato la questione della scelta: quale standard di annotazioni \u00e8 meglio utilizzare per il nostro lavoro?<\/p>\n<p>Inizialmente sembrava che ci fossero due soluzioni \u2014 le pi\u00f9 diffuse erano RAML e Swagger (o OAS). Ma in realt\u00e0 si \u00e8 rivelato che le alternative sono almeno 3 o pi\u00f9.<\/p>\n<p>Da un lato c'\u00e8 RAML, un linguaggio potente ed efficiente. Presenta una buona implementazione della gerarchia e dell'ereditariet\u00e0, rendendo questo formato pi\u00f9 adatto per grandi aziende che necessitano di molte descrizioni, cio\u00e8 non un solo prodotto, ma molti microservizi con parti comuni nei contratti, come schemi di autenticazione, tipi di dati identici e corpi di errore.<\/p>\n<p>Tuttavia, lo sviluppatore di RAML, la societ\u00e0 Mulesoft, si \u00e8 unita al consorzio Open API, che si occupa dello sviluppo <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>. Pertanto, lo sviluppo di RAML \u00e8 stato sospeso. Per immaginare il formato evento, si potrebbe pensare a come i manutentori dei componenti principali di Linux siano andati a lavorare per Microsoft. Tale situazione crea presupposti per l'uso di Swagger, che si sviluppa dinamicamente e, con la sua terza versione, sta quasi raggiungendo RAML in termini di flessibilit\u00e0 e funzionalit\u00e0.<\/p>\n<h3>Se non fosse per un piccolo particolare...<\/h3>\n<p>\nA quanto pare, non tutte le utilit\u00e0 open-source sono state aggiornate alla versione OAS 3.0. Per i microservizi su Go, il problema pi\u00f9 critico \u00e8 l'assenza di adattamento del <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-swagger\/go-swagger\">go-swagger<\/a><\/noindex> alla nuova versione dello standard. Tuttavia, la differenza tra Swagger 2 e Swagger 3 \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/swagger.io\/blog\/news\/whats-new-in-openapi-3-0\/\">enorme<\/a><\/noindex>. Ad esempio, nella terza versione gli sviluppatori:<\/p>\n<ul>\n<li>hanno migliorato la descrizione degli schemi di autenticazione<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swagger-api\/swagger-ui\/issues\/4819#issuecomment-413890929\">hanno completato<\/a><\/noindex> il supporto per JSON Schema<\/li>\n<li>hanno potenziato la possibilit\u00e0 di aggiungere esempi<\/li>\n<\/ul>\n<p>\nLa situazione diventa divertente: nella scelta dello standard, bisogna considerare RAML, Swagger 2 e Swagger 3 come alternative separate. Solo Swagger 2 ha un buon supporto per gli strumenti OpenSource. RAML \u00e8 molto flessibile... e complesso, mentre Swagger 3 \u00e8 poco supportato dalla comunit\u00e0, il che significa che dovrete fare affidamento su strumenti di sviluppo interno o soluzioni commerciali, che di solito sono piuttosto costose. <\/p>\n<p>Inoltre, mentre in Swagger ci sono molte funzionalit\u00e0 interessanti, come un portale pronto <noindex><a rel=\"nofollow\" href=\"https:\/\/editor.swagger.io\">editor.swagger.io<\/a><\/noindex>, sul quale \u00e8 possibile caricare le annotazioni e ottenere una visualizzazione con descrizioni dettagliate, link e relazioni, per il pi\u00f9 fondamentale e meno amichevole RAML non esiste una simile opportunit\u00e0. Certo, \u00e8 possibile cercare tra i progetti su GitHub per trovare un'alternativa e implementarla da soli. Tuttavia, in ogni caso, qualcuno deve occuparsi della manutenzione del portale, il che non \u00e8 molto conveniente per un utilizzo di base o per scopi di test. Inoltre, Swagger \u00e8 pi\u00f9 \"pragmatico\" o liberale: pu\u00f2 essere generato da commenti nel codice, il che chiaramente contraddice il principio API first e non \u00e8 supportato da nessuno degli strumenti RAML.<\/p>\n<p>In passato abbiamo iniziato a lavorare con RAML, considerando il linguaggio pi\u00f9 flessibile, e alla fine abbiamo dovuto fare molte cose manualmente. Ad esempio, in uno dei progetti utilizziamo uno strumento <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spotify\/ramlfications\">ramlfications<\/a><\/noindex> nei test unitari, che supporta solo RAML 0.8. Cos\u00ec abbiamo dovuto aggiungere delle soluzioni temporanee affinch\u00e9 lo strumento potesse \"gestire\" RAML versione 1.0.<\/p>\n<h3>E c'\u00e8 davvero bisogno di scegliere?<\/h3>\n<p>\nDopo aver lottato con l'estensione dell'ecosistema di soluzioni per RAML, siamo giunti alla conclusione che dobbiamo convertire RAML in Swagger 2 e condurre tutta l'automazione, verifica, test e successiva ottimizzazione l\u00ec. \u00c8 un buon modo per sfruttare sia la flessibilit\u00e0 di RAML che il supporto degli strumenti della comunit\u00e0 di Swagger. <\/p>\n<p>Per risolvere questo compito, esistono due strumenti OpenSource che dovrebbero garantire la conversione dei contratti:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mulesoft\/oas-raml-converter\">oas-raml-converter<\/a><\/noindex> \u2013 uno strumento attualmente non supportato. Durante l'utilizzo, abbiamo scoperto che presenta diversi problemi con RAML complessi, distribuiti su un gran numero di file. Questo programma \u00e8 scritto in JavaScript e svolge una visita ricorsiva dell'albero sintattico. A causa della tipizzazione dinamica, risulta difficile districarsi in questo codice, quindi abbiamo deciso di non perdere tempo a scrivere patch per un'utilit\u00e0 morente.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/raml-org\/webapi-parser\">webapi-parser<\/a><\/noindex> \u2014 uno strumento della stessa azienda che si propone di convertire tutto e in qualsiasi direzione. Attualmente dichiara supporto per RAML 0.8, RAML 1.0 e Swagger 2.0. Tuttavia, al momento della nostra ricerca, lo strumento era ancora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aml-org\/amf\/issues\/517\">ESTREMAMENTE<\/a><\/noindex> grezzo e inutilizzabile. Gli sviluppatori stanno creando una sorta di <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Intermediate_representation\">IR<\/a><\/noindex>, il che permetter\u00e0 loro in futuro di aggiungere rapidamente nuovi standard. Ma al momento tutto questo semplicemente non funziona.<\/li>\n<\/ol>\n<p>\nE queste non sono nemmeno tutte le difficolt\u00e0 con cui ci siamo confrontati. Uno dei passaggi del nostro pipeline \u00e8 la verifica che RAML nel repository sia conforme alla specifica. Abbiamo provato diverse utilit\u00e0. Sorprendentemente, tutte si sono lamentate delle nostre annotazioni in vari punti, con parole diverse e completamente inappropriate. E non sempre aveva senso :).<\/p>\n<p>Alla fine ci siamo concentrati su un progetto ormai obsoleto, che presenta anche una serie di problemi (si blocca senza motivo, ha difficolt\u00e0 con le espressioni regolari). Pertanto, non abbiamo trovato un modo per risolvere i problemi di validazione e conversione utilizzando strumenti gratuiti, e abbiamo deciso di utilizzare un software commerciale. In futuro, quando gli strumenti OpenSource saranno pi\u00f9 sviluppati, la soluzione a questo problema potrebbe diventare pi\u00f9 semplice. Nel frattempo, il tempo e le risorse necessarie per \"aggiustare\" ci sono sembrati pi\u00f9 significativi rispetto al costo del servizio commerciale.<\/p>\n<h3>Conclusione<\/h3>\n<p>\nDopo tutto ci\u00f2, abbiamo sentito il bisogno di condividere la nostra esperienza e sottolineare che, prima di scegliere uno strumento per la descrizione dei contratti, \u00e8 fondamentale definire chiaramente cosa si desidera da esso e quale budget si \u00e8 disposti a investire. A prescindere dagli strumenti OpenSource, ci sono gi\u00e0 molti servizi e prodotti che possono aiutare a effettuare controlli, conversioni e validazioni. Tuttavia, sono costosi, e talvolta, molto costosi. Per una grande azienda, tali spese possono essere tollerabili, ma per una startup possono rappresentare un carico significativo.<\/p>\n<p>Definire un insieme di strumenti che utilizzerete in seguito. Ad esempio, se avete bisogno solo di visualizzare un contratto, sar\u00e0 pi\u00f9 semplice utilizzare Swagger 2, che ha una bella API, mentre con RAML dovrete configurare e mantenere il servizio da soli.<br \/>\nMaggiore sar\u00e0 il numero delle vostre esigenze, pi\u00f9 ampia sar\u00e0 la richiesta di strumenti, e questi sono diversi per piattaforme differenti. \u00c8 meglio familiarizzare da subito con le versioni disponibili, per fare una scelta che minimizzi i vostri costi in futuro.<\/p>\n<p>Tuttavia, bisogna riconoscere che tutti gli ecosistemi esistenti al giorno d'oggi sono imperfetti. Pertanto, se in azienda ci sono appassionati che amano lavorare in RAML perch\u00e9 \u201cpermette di esprimere le idee in modo pi\u00f9 flessibile\u201d, o viceversa, preferiscono Swagger perch\u00e9 \u201c\u00e8 pi\u00f9 chiaro\u201d, \u00e8 meglio lasciarli lavorare con ci\u00f2 che conoscono e desiderano, poich\u00e9 gli strumenti di entrambi i formati richiedono modifiche manuali. <\/p>\n<p>Per quanto riguarda la nostra esperienza, nei prossimi post parleremo di quali controlli statici e dinamici eseguiamo sulla nostra architettura RAML-Swagger, oltre a quale documentazione generiamo dai contratti e come funziona tutto questo.<\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Quale linguaggio utilizzate per le annotazioni dei contratti dei microservizi?<\/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 (aka )<\/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>                    Un altro<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Non utilizzo<\/p>\n<\/li>\n<\/ul>\n<p>    100 utenti hanno votato. 24 utenti si sono astenuti.<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.0.1 - 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. \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\" \/>\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\/it\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Quindi, RAML o OAS (Swagger)? | ProHoster","description":"Nel dinamico mondo dei microservizi, tutto pu\u00f2 cambiare \u2014 qualsiasi componente pu\u00f2 essere riscritto in un altro linguaggio, utilizzando diversi framework e architetture. Ci\u00f2 che deve rimanere invariato sono solo i contratti, affinch\u00e9 si possa interagire con il microservizio in modo costante, indipendentemente dalle metamorfosi interne. Oggi parleremo del nostro problema nella scelta del formato di descrizione.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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. \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","og:url":"https:\/\/prohoster.info\/it\/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\/it\/wp-json\/wp\/v2\/posts\/38022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=38022"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/38022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28540"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=38022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=38022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=38022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}