{"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\/da\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","title":{"rendered":"S\u00e5 er det RAML eller OAS (Swagger)?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I en dynamisk verden af mikrotjenester kan alt \u00e6ndre sig \u2014 enhver komponent kan genskrives i et andet sprog ved hj\u00e6lp af forskellige rammer og arkitektur. Kun kontrakterne skal forblive u\u00e6ndrede, s\u00e5 mikrotjenesten kan interagere eksternt p\u00e5 en stabil basis uanset de interne transformationer. I dag vil vi fort\u00e6lle om vores problem med at v\u00e6lge formatet til beskrivelse af kontrakter og dele de artefakter, vi har fundet. <\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 er det RAML eller 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 \/>\nIndl\u00e6gget er forberedt af <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annatref\/\">Anna Melekhova<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/vlapat\/\">Vladimir Lapatin<\/a><\/noindex> <\/p>\n<p><b>Mikrotjenester.<\/b> Ved udviklingen af Acronis Cyber Cloud inds\u00e5 vi, at vi ikke kunne undg\u00e5 dem. Og designet af en mikrotjeneste er umuligt uden at formalisere kontrakten, som repr\u00e6senterer mikrotjenestens interface.<\/p>\n<p>Men n\u00e5r produktet indeholder mere end \u00e9n komponent, og udviklingen af kontrakten bliver en regelm\u00e6ssig aktivitet, begynder man uundg\u00e5eligt at t\u00e6nke over optimering af processen. Det bliver klart, at interface (kontrakt) og implementering (mikrotjeneste) skal matche hinanden, at forskellige komponenter skal udf\u00f8re de samme opgaver p\u00e5 samme m\u00e5de, og at uden en centraliseret beslutningsproces vil hvert team v\u00e6re n\u00f8dt til at bruge tid p\u00e5 at opn\u00e5 dem igen og igen. <\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 er det RAML eller OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/48048d36536f02a3a71821e7f6f32a17.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Skema for mikrotjenester fra Amazon fra <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/werner\/status\/741673514567143424\">tweeten<\/a><\/noindex> af Werner Vogels, CTO Amazon<\/i><br \/>\nHvad er dilemmaet? De facto er der to m\u00e5der, hvorp\u00e5 mikrotjenester kan interagere \u2013 HTTP Rest og gRPC fra Google. Uden at \u00f8nske at blive involveret i Googles teknologistak, valgte vi HTTP Rest. Annotationer til HTTP REST-kontrakter beskrives oftest i et af to formater: RAML og OAS, tidligere kendt som Swagger. Derfor st\u00e5r hvert udviklerteam over for valget af \u00e9n standard. Men som det viste sig, kan det v\u00e6re meget sv\u00e6rt at tr\u00e6ffe dette valg.<\/p>\n<h3>Hvorfor er annotationer n\u00f8dvendige?<\/h3>\n<p>\nEn annotation er n\u00f8dvendig, s\u00e5 eksterne brugere nemt kan forst\u00e5, hvad de kan g\u00f8re med din service gennem dens HTTP-interface. P\u00e5 et grundl\u00e6ggende niveau skal annotationen indeholde mindst en liste over tilg\u00e6ngelige ressourcer, deres HTTP-metoder, anmodningernes krop, opregning af parametre, angivelse af n\u00f8dvendige og underst\u00f8ttede overskrifter samt statuskoder og svarformater. Et ekstremt vigtigt element i kontraktannotation er ogs\u00e5 deres beskrivende forklaring (\"hvad sker der, hvis man tilf\u00f8jer denne query-parameter til anmodningen?\", \"hvorn\u00e5r bliver statuskode 400 returneret?\")<\/p>\n<p>N\u00e5r der er tale om udvikling af et stort antal mikrotjenester, er det dog \u00f8nskeligt at udvinde ekstra v\u00e6rdi fra de skrevne annotationer. For eksempel kan man baseret p\u00e5 RAML\/Swagger generere b\u00e5de klient- og serverkode p\u00e5 et enormt antal programmeringssprog. Man kan ogs\u00e5 automatisk generere dokumentation til mikrotjenesten og uploade den til din udviklerportal :).<\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 er det RAML eller OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/0c71fb27949bdde82172c58d0c95c432.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Eksempel p\u00e5 struktureret kontraktbeskrivelse<\/i><\/p>\n<p>Det er sj\u00e6ldnere at se praksis med at teste mikrotjenester baseret p\u00e5 kontraktbeskrivelser. Hvis du har skrevet b\u00e5de annotationen og komponenten, kan du oprette en automatisk test, der kontrollerer, om servicen fungerer korrekt med forskellige typer data som input. Returnerer servicen en svarkode, der ikke er beskrevet i annotationen? Kan den h\u00e5ndtere forskriftsm\u00e6ssigt forkerte data korrekt?<\/p>\n<p>Desuden g\u00f8r en kvalitetsimplementering af b\u00e5de kontrakterne og v\u00e6rkt\u00f8jer til visualisering af annotationer arbejdet med mikrotjenesten lettere. Det vil sige, hvis arkitekten har beskrevet kontrakten grundigt, vil designere og udviklere kunne integrere servicen i andre produkter uden yderligere tidsomkostninger.<\/p>\n<p>For brug af yderligere v\u00e6rkt\u00f8jer kan b\u00e5de RAML og OAS tilf\u00f8je metadata, som ikke er omfattet af standarden (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\/blob\/master\/versions\/3.0.0.md#specification-extensions\">for eksempel hvordan dette g\u00f8res i OAS<\/a><\/noindex>).<\/p>\n<p>Generelt er der et enormt kreativt rum i anvendelsen af kontrakter til mikrotjenester... i det mindste teoretisk<\/p>\n<h3>Sammenligning af en igle med en snog<\/h3>\n<p>\nI \u00f8jeblikket er Acronis' prioriterede udviklingsretning Acronis Cyber Platform. Acronis Cyber Platform er de nye integrationspunkter for tredjepartstjenester med Acronis Cyber Cloud og agentdelen. Selvom vores interne API'er, beskrevet i RAML, var tilstr\u00e6kkelige, rejste behovet for at offentligg\u00f8re API'et igen sp\u00f8rgsm\u00e5let om, hvilken standard for annoteringer der er bedst at bruge til vores arbejde?<\/p>\n<p>Oprindeligt s\u00e5 det ud til, at der var to l\u00f8sninger \u2014 de mest udbredte udviklinger RAML og Swagger (eller OAS). Men i praksis viste det sig, at der er mindst tre, hvis ikke flere alternativer.<\/p>\n<p>P\u00e5 den ene side er der RAML \u2014 et kraftfuldt og effektivt sprog. Det har en god implementering af hierarki og arv, s\u00e5 dette format passer bedre til store virksomheder, der har brug for mange beskrivelser \u2014 det vil sige ikke \u00e9t produkt, men mange mikrotjenester, som har f\u00e6lles elementer i deres kontrakter \u2014 autentificeringsskemaer, ens datatyper, fejlmeddelelser.<\/p>\n<p>Men udvikleren af RAML, Mulesoft, har tilsluttet sig konsortiet Open API, som arbejder p\u00e5 udviklingen af <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>. Derfor er udviklingen af RAML blevet sat p\u00e5 pause. For at forestille sig formatet af begivenheden, kan man t\u00e6nke p\u00e5, at vedligeholderne af de prim\u00e6re komponenter i Linux gik over til Microsoft. En s\u00e5dan situation skaber foruds\u00e6tninger for at bruge Swagger, som udvikler sig dynamisk, og i den seneste \u2014 tredje version \u2014 n\u00e6sten indhenter RAML n\u00e5r det kommer til fleksibilitet og funktionalitet.<\/p>\n<h3>Hvis det ikke var for \u00e9n ting\u2026<\/h3>\n<p>\nDet viste sig, at langt fra alle open-source v\u00e6rkt\u00f8jer var opdateret til OAS 3.0-versionen. For mikrotjenester skrevet i Go vil det kritiske v\u00e6re frav\u00e6ret af tilpasning <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-swagger\/go-swagger\">go-swagger<\/a><\/noindex> til den nye version af standarden. Men forskellen mellem Swagger 2 og Swagger 3 er <noindex><a rel=\"nofollow\" href=\"https:\/\/swagger.io\/blog\/news\/whats-new-in-openapi-3-0\/\">enorm<\/a><\/noindex>. For eksempel har udviklerne i den tredje version:<\/p>\n<ul>\n<li>forbedret beskrivelsen af autentificeringsskemaer<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swagger-api\/swagger-ui\/issues\/4819#issuecomment-413890929\">f\u00e6rdiggjort<\/a><\/noindex> underst\u00f8ttelsen af JSON Schema<\/li>\n<li>opgraderet muligheden for at tilf\u00f8je eksempler<\/li>\n<\/ul>\n<p>\nSituationen er derfor sjov: n\u00e5r man v\u00e6lger standarden, skal man overveje RAML, Swagger 2 og Swagger 3 som separate alternativer. Her har kun Swagger 2 god st\u00f8tte fra OpenSource-v\u00e6rkt\u00f8jer. RAML er meget fleksibel\u2026 og kompleks, mens Swagger 3 har begr\u00e6nset support fra f\u00e6llesskabet, s\u00e5 du m\u00e5 bruge v\u00e6rkt\u00f8jer, der er udviklet internt eller kommercielle l\u00f8sninger, som typisk er ret dyre. <\/p>\n<p>Samtidig findes der mange behagelige funktioner i Swagger, s\u00e5som en klar portal <noindex><a rel=\"nofollow\" href=\"https:\/\/editor.swagger.io\">editor.swagger.io<\/a><\/noindex>, hvor man kan uploade en annotering og f\u00e5 dens visualisering med en detaljeret beskrivelse, links og relationer, er der ikke mulighed for noget lignende med det mere grundl\u00e6ggende og mindre brugervenlige RAML. Ja, man kan s\u00f8ge efter noget blandt projekter p\u00e5 GitHub, finde en tilsvarende og selv implementere det. Men uanset hvad, skal nogen vedligeholde portalen, hvilket ikke er s\u00e5 praktisk til grundl\u00e6ggende brug eller testform\u00e5l. Derudover er Swagger mere \u201cprincipl\u00f8st\u201d eller liberalt - det kan genereres fra kommentarer i koden, hvilket selvf\u00f8lgelig g\u00e5r imod API-first-princippet og ikke underst\u00f8ttes af noget v\u00e6rkt\u00f8j til RAML.<\/p>\n<p>Dengang begyndte vi at arbejde med RAML som et mere fleksibelt sprog, og endte med at skulle lave meget selv. For eksempel bruger et af vores projekter et v\u00e6rkt\u00f8j <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spotify\/ramlfications\">ramlfications<\/a><\/noindex> i unit-tests, som kun underst\u00f8tter RAML 0.8. S\u00e5 vi m\u00e5tte tilf\u00f8je nogen l\u00f8sninger, s\u00e5 v\u00e6rkt\u00f8jet kunne \u201cfort\u00e6re\u201d RAML version 1.0.<\/p>\n<h3>Er det n\u00f8dvendigt at v\u00e6lge?<\/h3>\n<p>\nEfter at have brugt tid p\u00e5 at tilf\u00f8je \u00f8kosysteml\u00f8sninger til RAML, kom vi frem til, at vi skal konvertere RAML til Swagger 2 og derefter udf\u00f8re al automatisering, kontrollere, teste og efterf\u00f8lgende optimere i det. Det er en god m\u00e5de at udnytte b\u00e5de fleksibiliteten i RAML og st\u00f8tte fra f\u00e6llesskabet med Swagger-v\u00e6rkt\u00f8jer. <\/p>\n<p>Til at l\u00f8se denne opgave findes der to OpenSource-v\u00e6rkt\u00f8jer, som skal kunne konvertere kontrakter:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mulesoft\/oas-raml-converter\">oas-raml-converter<\/a><\/noindex> \u2013 et i \u00f8jeblikket ikke-underst\u00f8ttet v\u00e6rkt\u00f8j. Under arbejdet med det opdagede vi, at det har en r\u00e6kke problemer med komplekse RAML'er, der er \u201cspredt\u201d over mange filer. Dette program er skrevet i JavaScript og udf\u00f8rer en rekursiv gennemgang af syntaktisk tr\u00e6. P\u00e5 grund af den dynamiske typisering blev det sv\u00e6rt at forst\u00e5 koden, s\u00e5 vi besluttede ikke at bruge tid p\u00e5 at skrive patches til det d\u00f8ende v\u00e6rkt\u00f8j.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/raml-org\/webapi-parser\">webapi-parser<\/a><\/noindex> \u2014 et v\u00e6rkt\u00f8j fra det samme firma, der h\u00e6vder at v\u00e6re klar til at konvertere alt mellem himmel og jord, og det i begge retninger. P\u00e5 nuv\u00e6rende tidspunkt er der p\u00e5st\u00e5et st\u00f8tte for RAML 0.8, RAML 1.0 og Swagger 2.0. Men p\u00e5 tidspunktet for vores unders\u00f8gelse var v\u00e6rkt\u00f8jet stadig <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aml-org\/amf\/issues\/517\">ULTRA<\/a><\/noindex> r\u00e5t og uegnet til brug. Udviklerne skaber en slags <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Intermediate_representation\">IR<\/a><\/noindex>, hvilket vil g\u00f8re det muligt for dem hurtigt at tilf\u00f8je nye standarder i fremtiden. Men indtil da fungerer alt dette bare ikke.<\/li>\n<\/ol>\n<p>\nOg det er endnu ikke alle de problemer, vi har st\u00f8dt p\u00e5. Et af trinene i vores pipeline er at kontrollere, at RAML fra depotet er korrekt i forhold til specifikationen. Vi har pr\u00f8vet flere v\u00e6rkt\u00f8jer. Utroligt nok brokkede de sig alle over vores annotationer forskellige steder med forskellige klager. Og det var ikke altid berettiget :).<\/p>\n<p>Til sidst endte vi med et nu for\u00e6ldet projekt, som ogs\u00e5 har en r\u00e6kke problemer (det g\u00e5r nogle gange ned uden grund, har problemer med regul\u00e6re udtryk). Dermed fandt vi ikke en m\u00e5de at l\u00f8se validerings- og konverteringsopgaverne baseret p\u00e5 gratis v\u00e6rkt\u00f8jer, og besluttede at bruge et kommercielt v\u00e6rkt\u00f8j. I fremtiden, n\u00e5r OpenSource-v\u00e6rkt\u00f8jer bliver mere udviklede, kan det blive nemmere at l\u00f8se denne opgave. Indtil videre forekom arbejds- og tidsomkostningerne ved at \"fikse\" det mere betydelige end prisen p\u00e5 den kommercielle tjeneste.<\/p>\n<h3>Konklusion<\/h3>\n<p>\nEfter al dette \u00f8nskede vi at dele vores erfaring og bem\u00e6rke, at n\u00e5r man v\u00e6lger et v\u00e6rkt\u00f8j til beskrivelse af kontrakter, skal man v\u00e6re klar over, hvad man \u00f8nsker fra det, og hvilket budget man er villig til at investere. Hvis man ser bort fra OpenSource, er der allerede nu mange tjenester og produkter, der kan hj\u00e6lpe med at lave kontroller, konvertere og validere. Men de er dyre, og nogle gange - meget dyre. For en stor virksomhed er s\u00e5danne omkostninger tolerable, men for en opstartsvirksomhed kan de udg\u00f8re en stor byrde.<\/p>\n<p>Bestem det s\u00e6t v\u00e6rkt\u00f8jer, du vil bruge senere. For eksempel, hvis du blot har brug for at vise en kontrakt, vil det v\u00e6re lettere at bruge Swagger 2, som har et p\u00e6nt API, da du selv skal oprette og vedligeholde tjenesten i RAML.<br \/>\nJo flere opgaver du har, desto st\u00f8rre bliver behovet for v\u00e6rkt\u00f8jer, og de er forskellige for forskellige platforme, s\u00e5 det er bedst at s\u00e6tte sig ind i de tilg\u00e6ngelige versioner for at tr\u00e6ffe et valg, der minimerer dine omkostninger i fremtiden.<\/p>\n<p>Men m\u00e5 erkende, at alle de \u00f8kosystemer, der findes i dag, er ufuldkomne. S\u00e5 hvis der er entusiaster i virksomheden, der elsker at arbejde med RAML, fordi \"det giver mulighed for at udtrykke tankerne mere fleksibelt\", eller omvendt foretr\u00e6kker Swagger, fordi \"det er mere forst\u00e5eligt\", s\u00e5 er det bedst at lade dem arbejde i det, de er vant til og \u00f8nsker, da v\u00e6rkt\u00f8jet for begge formater kr\u00e6ver finjustering. <\/p>\n<p>N\u00e5r det kommer til vores erfaring, vil vi i de f\u00f8lgende indl\u00e6g fort\u00e6lle om, hvilke - statiske og dynamiske kontroller vi udf\u00f8rer baseret p\u00e5 vores RAML-Swagger-arkitektur, samt hvilken dokumentation vi genererer ud fra kontrakterne, og hvordan alt dette fungerer.<\/p>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Hvilket sprog bruger du til annotationer af mikrotjenestekontrakter?<\/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>                    Andet<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bruger ikke<\/p>\n<\/li>\n<\/ul>\n<p>    100 brugere har stemt. 24 brugere undlod at deltage.<br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47S\u00e5 hvad er valget: RAML eller OAS (Swagger)? | ProHoster","description":"I den dynamiske verden af mikrotjenester kan alt \u00e6ndre sig - enhver komponent kan skrives om p\u00e5 et andet sprog, ved at bruge andre rammer og arkitektur.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/38022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=38022"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/38022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28540"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=38022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=38022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=38022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}