{"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":"Quindi RAML o OAS (Swagger)?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nel mondo dinamico dei microservizi pu\u00f2 cambiare qualsiasi cosa: ogni componente pu\u00f2 essere riscritto in un'altra lingua, utilizzando diversi framework e architetture. Gli unici elementi che devono rimanere invariati sono i contratti, affinch\u00e9 si possa interagire con i microservizi in modo costante, indipendentemente dalle metamorfosi interne. Oggi parleremo del nostro problema nella scelta del formato di descrizione dei contratti e condivideremo gli artefatti trovati. <\/p>\n<p><img decoding=\"async\" alt=\"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> Durante lo sviluppo di Acronis Cyber Cloud ci siamo resi conto che non potevamo evitarli. La progettazione di un microservizio \u00e8 impossibile senza formalizzare il contratto, che rappresenta l'interfaccia del microservizio.<\/p>\n<p>Ma quando nel prodotto c'\u00e8 pi\u00f9 di un componente, e lo sviluppo di contratti diventa un'attivit\u00e0 regolare, si comincia a pensare a come ottimizzare il processo. Diventa evidente che l'interfaccia (contratto) e l'implementazione (microservizio) devono corrispondere, che i diversi componenti devono fare le stesse cose in modo coerente e che senza un processo centralizzato per prendere tutte queste decisioni, ogni team sar\u00e0 costretto a spendere tempo a ripetere queste scelte. <\/p>\n<p><img decoding=\"async\" alt=\"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 per interagire fra microservizi: HTTP Rest e gRPC di Google. Non volendo essere coinvolti nello stack tecnologico di Google, abbiamo scelto HTTP Rest. Le annotazioni per i contratti HTTP Rest vengono solitamente descritte in uno dei due formati: RAML e OAS, precedentemente noto come Swagger. Pertanto, ogni team di sviluppo si trova di fronte alla necessit\u00e0 di scegliere uno degli standard. Ma, come si \u00e8 rivelato, fare questa scelta pu\u00f2 essere molto complicato.<\/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 tuo servizio tramite la sua interfaccia HTTP. In altre parole, a un livello base, l'annotazione dovrebbe contenere almeno un elenco delle risorse disponibili, i loro metodi HTTP, i corpi delle richieste, un elenco dei parametri, l'indicazione degli header necessari e supportati, nonch\u00e9 dei codici di risposta e dei formati di risposta. Un elemento estremamente importante dell'annotazione del contratto \u00e8 anche la loro descrizione verbale (\"cosa succeder\u00e0 se aggiungo questo parametro di query alla richiesta?\", \"in quale caso verr\u00e0 restituito il codice 400?\")<\/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 gran numero di linguaggi di programmazione. Inoltre, si pu\u00f2 ottenere automaticamente la documentazione per il microservizio e caricarla sul vostro developer-portal :).<\/p>\n<p><img decoding=\"async\" alt=\"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 di un contratto<\/i><\/p>\n<p>\u00c8 meno comune la pratica di testare i microservizi basandosi sulle descrizioni dei contratti. Se hai scritto sia l'annotazione che il componente, \u00e8 possibile creare un test automatico che verifica l'adeguatezza del funzionamento del servizio con vari tipi di dati in ingresso. Il servizio restituisce un codice di risposta non descritto nell'annotazione? Sar\u00e0 in grado di gestire correttamente dati manifestamente errati?<\/p>\n<p>Inoltre, una buona implementazione non solo dei contratti stessi, ma anche degli strumenti per la visualizzazione delle annotazioni consente di semplificare il lavoro con il microservizio. In altre parole, se l'architetto ha descritto il contratto in modo efficace, i designer e gli sviluppatori saranno in grado di integrare il servizio in altri prodotti senza ulteriori perdite di tempo.<\/p>\n<p>Per consentire 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\">ad esempio, cos\u00ec \u00e8 fatto in OAS<\/a><\/noindex>).<\/p>\n<p>In generale, c'\u00e8 uno spazio enorme per la creativit\u00e0 nell'applicazione dei contratti per i microservizi... almeno in teoria<\/p>\n<h3>Confronto tra un riccio e un serpente<\/h3>\n<p>\nAttualmente, la direzione prioritaria dello sviluppo in Acronis \u00e8 l'evoluzione della Acronis Cyber Platform. La Acronis Cyber Platform rappresenta nuovi punti di integrazione per i servizi di terze parti con Acronis Cyber Cloud e il suo lato agenziale. Anche se le nostre API interne, descritte in RAML, ci soddisfacevano, la necessit\u00e0 di pubblicare API ha nuovamente sollevato la questione della scelta: quale standard di annotazioni \u00e8 meglio utilizzare per il nostro lavoro?<\/p>\n<p>Inizialmente sembrava che le soluzioni fossero due: le pi\u00f9 comuni implementazioni di 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, quindi questo formato \u00e8 pi\u00f9 adatto per grandi aziende che necessitano di molte descrizioni, ovvero non un solo prodotto, ma diversi microservizi che condividono parti comuni dei contratti: schemi di autenticazione, tipi di dati identici, corpi di errore.<\/p>\n<p>Ma lo sviluppatore di RAML, l'azienda Mulesoft, si \u00e8 unita al consorzio Open API, che si occupa dello sviluppo di <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 dell'evento, pensate che i manutentori dei componenti fondamentali di Linux siano andati a lavorare in Microsoft. Una situazione del genere crea presupposti per utilizzare Swagger, che si evolve dinamicamente e nell'ultima versione \u2014 la terza \u2014 sta praticamente recuperando terreno rispetto a RAML in termini di flessibilit\u00e0 e funzionalit\u00e0.<\/p>\n<h3>Se non fosse per una cosa\u2026<\/h3>\n<p>\nA quanto pare, non tutte le utility open-source si sono aggiornate alla versione OAS 3.0. Per i microservizi in Go, la mancanza di adattamento del <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-swagger\/go-swagger\">go-swagger<\/a><\/noindex> alla nuova versione dello standard sar\u00e0 la pi\u00f9 critica. 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 risulta interessante: nella scelta dello standard \u00e8 necessario considerare RAML, Swagger 2 e Swagger 3 come alternative distinte. Solo Swagger 2 offre un buon supporto per gli strumenti Open Source. RAML \u00e8 molto flessibile\u2026 e complesso, mentre Swagger 3 \u00e8 poco supportato dalla comunit\u00e0, quindi dovrete fare affidamento su strumenti sviluppati internamente o soluzioni commerciali che, generalmente, hanno un costo piuttosto elevato. <\/p>\n<p>Inoltre, se in Swagger ci sono molte funzioni interessanti, come un portale pronto all'uso <noindex><a rel=\"nofollow\" href=\"https:\/\/editor.swagger.io\">editor.swagger.io<\/a><\/noindex>, sul quale \u00e8 possibile caricare un'annotazione e ottenere la sua visualizzazione con una descrizione dettagliata, link e relazioni, mentre per il RAML, che \u00e8 pi\u00f9 fondamentale e meno user-friendly, questa possibilit\u00e0 non \u00e8 presente. \u00c8 possibile cercare qualcosa tra i progetti su GitHub, trovare un equivalente e implementarlo autonomamente. Tuttavia, in ogni caso, qualcuno dovr\u00e0 gestire il portale, il che non \u00e8 molto conveniente per un utilizzo base o per scopi di test. Inoltre, Swagger \u00e8 pi\u00f9 \"senza principi\", o liberale \u2014 pu\u00f2 essere generato dai commenti nel codice, il che, ovviamente, contrasta con il principio API first e non \u00e8 supportato da nessuno degli strumenti RAML.<\/p>\n<p>Un tempo, abbiamo iniziato a lavorare con RAML, come un linguaggio pi\u00f9 flessibile, e alla fine abbiamo dovuto fare molto da soli. Ad esempio, in uno dei progetti si utilizza un'utilit\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spotify\/ramlfications\">ramlfications<\/a><\/noindex> nei test unitari, che supporta solo RAML 0.8. Quindi abbiamo dovuto aggiungere dei workaround affinch\u00e9 l'utilit\u00e0 potesse \"gestire\" RAML versione 1.0.<\/p>\n<h3>\u00c8 necessario scegliere?<\/h3>\n<p>\nDopo aver esplorato l'ecosistema delle soluzioni per RAML, siamo giunti alla conclusione che dovevamo convertire RAML in Swagger 2 e svolgere tutta l'automazione, verifica, test e successiva ottimizzazione in questo formato. \u00c8 un ottimo modo per utilizzare sia la flessibilit\u00e0 di RAML sia il supporto degli strumenti della comunit\u00e0 di Swagger. <\/p>\n<p>Per affrontare questa problematica 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 un'utilit\u00e0 attualmente non supportata. Durante il lavoro con essa abbiamo scoperto che presenta una serie di problemi con i RAML complessi, che sono \"sparsi\" su un gran numero di file. Questo programma \u00e8 scritto in JavaScript e esegue una traversata ricorsiva dell'albero sintattico. A causa della tipizzazione dinamica, diventa difficile comprendere questo codice, quindi abbiamo deciso di non perdere tempo a scrivere patch per un'utilit\u00e0 in fase di estinzione.<\/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 pretende di poter convertire tutto e di tutto, in entrambe le direzioni. Ad oggi, \u00e8 dichiarato il supporto per RAML 0.8, RAML 1.0 e Swagger 2.0. Tuttavia, al momento della nostra ricerca, l'utilit\u00e0 era ancora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aml-org\/amf\/issues\/517\">ESTREMAMENTE<\/a><\/noindex> instabile e inadeguata per l'uso. Gli sviluppatori creano una sorta di <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Intermediate_representation\">IR<\/a><\/noindex>, che permetter\u00e0 loro di aggiungere rapidamente nuovi standard in futuro. Ma per ora tutto ci\u00f2 semplicemente non funziona.<\/li>\n<\/ol>\n<p>\nE questa non \u00e8 nemmeno l'unica difficolt\u00e0 che abbiamo affrontato. Uno dei passaggi del nostro pipeline \u00e8 verificare che il RAML del repository sia conforme alla specifica. Abbiamo provato diversi strumenti. Sorprendentemente, tutti si sono lamentati delle nostre annotazioni in vari punti e con parole molto poco gentili. E non sempre a buon diritto :).<\/p>\n<p>Alla fine ci siamo fermati su un progetto ora obsoleto, che ha anche una serie di problemi (a volte si blocca senza motivo, ha problemi con le espressioni regolari). Di conseguenza, non siamo riusciti a trovare un modo per risolvere i problemi di validazione e conversione basandoci su strumenti gratuiti e abbiamo deciso di utilizzare uno strumento commerciale. In futuro, quando gli strumenti Open Source saranno pi\u00f9 sviluppati, la risoluzione di questo problema potrebbe diventare pi\u00f9 semplice. Per ora, i costi in termini di tempo e lavoro per \"aggiustare\" ci sono sembrati pi\u00f9 significativi rispetto al costo del servizio commerciale.<\/p>\n<h3>Conclusione<\/h3>\n<p>\nDopo tutto questo, abbiamo avuto voglia di condividere la nostra esperienza e sottolineare che, prima di scegliere uno strumento per descrivere i contratti, \u00e8 necessario definire chiaramente cosa si desidera e quale budget si \u00e8 pronti a investire. Se si ignora l'Open Source, ci sono gi\u00e0 molti servizi e prodotti che possono aiutare a fare verifiche, convertire e validare. Ma costano caro, e a volte \u2013 carissimo. Per una grande azienda, tali costi sono sostenibili, ma per una startup possono rappresentare un grande peso.<\/p>\n<p>Definire un insieme di strumenti che utilizzerai in seguito. Ad esempio, se hai bisogno solo di visualizzare il contratto, sar\u00e0 pi\u00f9 semplice usare Swagger 2, che ha una bellissima API, mentre con RAML dovrai attivare e mantenere il servizio da solo.<br \/>\nPi\u00f9 saranno le tue esigenze, maggiore sar\u00e0 la necessit\u00e0 di strumenti, che sono diversi per diverse piattaforme, ed \u00e8 meglio informarsi subito sulle versioni disponibili per fare una scelta che minimizzi i tuoi costi futuri.<\/p>\n<p>Ma va riconosciuto che tutti gli ecosistemi esistenti oggi non sono perfetti. Pertanto, se in azienda ci sono appassionati che amano lavorare in RAML perch\u00e9 \"consente di esprimere le idee in modo pi\u00f9 flessibile\", o viceversa, che preferiscono Swagger perch\u00e9 \"\u00e8 pi\u00f9 chiaro\", \u00e8 meglio lasciarli lavorare in quello che conoscono e desiderano, poich\u00e9 gli strumenti di ciascuno dei formati richiedono un po' di lavoro di affinamento. <\/p>\n<p>Per quanto riguarda la nostra esperienza, nei prossimi post parleremo di quali controlli statici e dinamici effettuiamo sulla nostra architettura RAML-Swagger, oltre a quale documentazione generiamo dai contratti e come tutto questo funzioni.<\/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 (alias )<\/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>                    Altro<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Non uso<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 100 utenti. 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.1.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.\" \/>\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.1.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.\" \/>\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\udd47 Quindi RAML o OAS (Swagger)? | ProHoster","description":"Nel mondo dinamico dei microservizi, tutto pu\u00f2 cambiare: qualsiasi componente pu\u00f2 essere riscritto in un altro linguaggio, utilizzando framework e architetture diverse.","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.","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}]}}