{"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\/sv\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","title":{"rendered":"S\u00e5 vad \u00e4r det? RAML eller OAS (Swagger)?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I en dynamisk v\u00e4rld av mikrotj\u00e4nster kan allt f\u00f6r\u00e4ndras \u2013 vilken som helst komponent kan skrivas om p\u00e5 ett annat spr\u00e5k, med andra ramverk och arkitektur. Endast kontrakten b\u00f6r f\u00f6rbli of\u00f6r\u00e4ndrade s\u00e5 att man kan interagera med mikrotj\u00e4nsten externt p\u00e5 en viss konstant grund, oavsett interna metamorfoser. Idag kommer vi att ber\u00e4tta om v\u00e5rt problem med att v\u00e4lja formatet f\u00f6r att beskriva kontrakt och dela med oss av de artefakter vi har funnit. <\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 vad \u00e4r 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 \/>\nInl\u00e4gget \u00e4r f\u00f6rfattat av <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annatref\/\">Anna Melekhova<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/vlapat\/\">Vladimir Lapatin<\/a><\/noindex> <\/p>\n<p><b>Mikrotj\u00e4nster.<\/b> Vid utvecklingen av Acronis Cyber Cloud ins\u00e5g vi att vi inte kan undkomma dem. Utformningen av en mikrotj\u00e4nst \u00e4r om\u00f6jlig utan formaliserandet av kontraktet, som utg\u00f6r gr\u00e4nssnittet f\u00f6r mikrotj\u00e4nsten.<\/p>\n<p>Men n\u00e4r produkten inneh\u00e5ller mer \u00e4n en komponent, och utvecklingen av kontraktet blir en regelbunden aktivitet, b\u00f6rjar man oavsiktligt t\u00e4nka p\u00e5 att optimera processen. Det blir uppenbart att gr\u00e4nssnittet (kontraktet) och implementationen (mikrotj\u00e4nsten) m\u00e5ste motsvara varandra, att olika komponenter m\u00e5ste utf\u00f6ra samma uppgifter p\u00e5 ett enhetligt s\u00e4tt, och att utan centraliserad beslutsfattande kommer varje team att tvingas spendera tid p\u00e5 att \u00e5terigen skaffa dessa beslut. <\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 vad \u00e4r det? RAML eller OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/48048d36536f02a3a71821e7f6f32a17.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mikrotj\u00e4nstschemat fr\u00e5n Amazon i <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/werner\/status\/741673514567143424\">en tweet<\/a><\/noindex> av Werner Vogels, CTO Amazon<\/i><br \/>\nVad best\u00e5r dilemmat av? De facto finns det tv\u00e5 s\u00e4tt f\u00f6r mikrotj\u00e4nster att interagera \u2013 HTTP Rest och gRPC fr\u00e5n Google. Utan att vilja involveras i Googles teknikstack valde vi HTTP Rest. Annotations f\u00f6r HTTP REST-kontrakten beskrivs oftast i ett av tv\u00e5 format: RAML och OAS, tidigare k\u00e4nt som Swagger. D\u00e4rf\u00f6r st\u00e4lls varje utvecklingsteam inf\u00f6r behovet av att v\u00e4lja ett av standarderna. Men som det visat sig kan detta val vara mycket sv\u00e5rt.<\/p>\n<h3>Varf\u00f6r beh\u00f6vs annotationer?<\/h3>\n<p>\nEn sammanfattning beh\u00f6vs s\u00e5 att externa anv\u00e4ndare enkelt kan f\u00f6rst\u00e5 vad som kan g\u00f6ras med din tj\u00e4nst via dess HTTP-gr\u00e4nssnitt. Det inneb\u00e4r att en grundl\u00e4ggande sammanfattning minst ska inneh\u00e5lla en lista \u00f6ver tillg\u00e4ngliga resurser, deras HTTP-metoder, f\u00f6rfr\u00e5gans kropp, en uppr\u00e4kning av parametrar, angivande av n\u00f6dv\u00e4ndiga och st\u00f6dda rubriker samt returkoder och svarformat. En extremt viktig del av kontraktsbeskrivningen \u00e4r deras verbala beskrivning (\"vad h\u00e4nder om du l\u00e4gger till denna query-parameter i f\u00f6rfr\u00e5gan?\", \"under vilka omst\u00e4ndigheter returneras kod 400?\")<\/p>\n<p>Trots detta, n\u00e4r det g\u00e4ller att utveckla ett stort antal mikrotj\u00e4nster, vill man dra nytta av de skrivna sammanfattningarna. Till exempel kan man generera s\u00e5v\u00e4l klient- som serverkod baserat p\u00e5 RAML\/Swagger p\u00e5 en m\u00e4ngd olika programmeringsspr\u00e5k. Dessutom kan man automatiskt f\u00e5 dokumentation f\u00f6r mikrotj\u00e4nsten och ladda upp den p\u00e5 din utvecklarportal :).<\/p>\n<p><img decoding=\"async\" alt=\"S\u00e5 vad \u00e4r det? RAML eller OAS (Swagger)?\" src=\"\/wp-content\/uploads\/2019\/09\/0c71fb27949bdde82172c58d0c95c432.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Exempel p\u00e5 strukturerad kontraktsbeskrivning<\/i><\/p>\n<p>Det \u00e4r s\u00e4llan man testar mikrotj\u00e4nster baserat p\u00e5 kontraktsbeskrivningar. Om du har skrivit b\u00e5de sammanfattningen och komponenten kan du skapa ett automatiskt test som kontrollerar tj\u00e4nstens korrekthet med olika typer av indata. Returnerar inte tj\u00e4nsten en svarkod som inte beskrivs i sammanfattningen? Kan den korrekt hantera uppenbart felaktiga data?<\/p>\n<p>Mer \u00e4n s\u00e5, en kvalitativ implementering av inte bara kontrakten utan \u00e4ven verktygen f\u00f6r att visualisera sammanfattningar f\u00f6renklar arbetet med mikrotj\u00e4nsten. Det vill s\u00e4ga, om arkitekten har beskrivit kontraktet kvalitativt, kommer designers och utvecklare att implementera tj\u00e4nsten i andra produkter utan ytterligare tidskostnader.<\/p>\n<p>F\u00f6r att arbeta med ytterligare verktyg har b\u00e5de RAML och OAS m\u00f6jligheten att l\u00e4gga till metadatan som inte f\u00f6reskrivs av standarden (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\/blob\/master\/versions\/3.0.0.md#specification-extensions\">till exempel, s\u00e5 h\u00e4r g\u00f6rs det i OAS<\/a><\/noindex>).<\/p>\n<p>I allm\u00e4nhet finns det enormt med utrymme f\u00f6r kreativitet n\u00e4r det g\u00e4ller till\u00e4mpningen av kontrakt f\u00f6r mikrotj\u00e4nster\u2026 \u00e5tminstone teoretiskt<\/p>\n<h3>J\u00e4mf\u00f6relse av igelkott med snok<\/h3>\n<p>\nF\u00f6r n\u00e4rvarande \u00e4r det prioriterade utvecklingsomr\u00e5det inom Acronis Acronis Cyber Platform. Acronis Cyber Platform \u00e4r nya integrationspunkter f\u00f6r tredjepartstj\u00e4nster med Acronis Cyber Cloud och agentdelen. Trots att v\u00e5ra interna API:er, beskrivna i RAML, har varit tillfredsst\u00e4llande, har behovet av att publicera API \u00e5terigen v\u00e4ckt fr\u00e5gan om vilket annotationsstandard som \u00e4r b\u00e4st att anv\u00e4nda f\u00f6r v\u00e5rt arbete?<\/p>\n<p>Till en b\u00f6rjan verkade det som att det fanns tv\u00e5 l\u00f6sningar \u2014 de mest spridda bilderna RAML och Swagger (eller OAS). Men det visade sig att det finns minst tre eller fler alternativ.<\/p>\n<p>\u00c5 ena sidan finns RAML \u2013 ett kraftfullt och effektivt spr\u00e5k. Det implementerar hierarkier och arv v\u00e4l, s\u00e5 detta format passar b\u00e4ttre f\u00f6r stora f\u00f6retag som beh\u00f6ver m\u00e5nga beskrivningar \u2014 det handlar om m\u00e5nga mikrotj\u00e4nster som har gemensamma delar av kontrakt \u2014 autentisering scheman, identiska datatyper, felmeddelanden.<\/p>\n<p>Men utvecklaren av RAML, f\u00f6retaget Mulesoft, har g\u00e5tt med i Open API-konsortiet som sysslar med utvecklingen <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>. D\u00e4rf\u00f6r har utvecklingen av RAML avstannat. F\u00f6r att f\u00f6rest\u00e4lla sig formatet f\u00f6r h\u00e4ndelser, f\u00f6rest\u00e4ll dig att de som uppr\u00e4tth\u00e5ller de grundl\u00e4ggande komponenterna i Linux har g\u00e5tt f\u00f6r att arbeta p\u00e5 Microsoft. En s\u00e5dan situation skapar f\u00f6ruts\u00e4ttningar f\u00f6r att anv\u00e4nda Swagger, som utvecklas dynamiskt och i den senaste \u2014 tredje versionen \u2014 n\u00e4stan hinner ikapp RAML i flexibilitet och funktionalitet.<\/p>\n<h3>Om det inte vore f\u00f6r en sak...<\/h3>\n<p>\nDet visade sig att l\u00e5ngt ifr\u00e5n alla open-source verktyg har uppdaterats till OAS 3.0-versionen. F\u00f6r mikrotj\u00e4nster p\u00e5 Go kommer den st\u00f6rsta kritiska punkten att vara avsaknaden av anpassning <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-swagger\/go-swagger\">go-swagger<\/a><\/noindex> till den senaste versionen av standarden. Men skillnaden mellan Swagger 2 och Swagger 3 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/swagger.io\/blog\/news\/whats-new-in-openapi-3-0\/\">\u00e4r enorm<\/a><\/noindex>. Till exempel har utvecklarna i den tredje versionen:<\/p>\n<ul>\n<li>f\u00f6rb\u00e4ttrat beskrivningen av autentisering scheman<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swagger-api\/swagger-ui\/issues\/4819#issuecomment-413890929\">slutf\u00f6rt<\/a><\/noindex> st\u00f6det f\u00f6r JSON Schema<\/li>\n<li>f\u00f6rb\u00e4ttrat m\u00f6jligheten att l\u00e4gga till exempel<\/li>\n<\/ul>\n<p>\nSituationen blir lustig: vid valet av standard m\u00e5ste RAML, Swagger 2 och Swagger 3 betraktas som separata alternativ. Endast Swagger 2 har ett bra st\u00f6d f\u00f6r OpenSource-verktyg. RAML \u00e4r mycket flexibelt\u2026 och komplicerat, medan Swagger 3 har svagt st\u00f6d fr\u00e5n gemenskapen, s\u00e5 du kommer att beh\u00f6va anv\u00e4nda egna utvecklade verktyg eller kommersiella l\u00f6sningar som vanligtvis kostar ganska mycket. <\/p>\n<p>Det finns m\u00e5nga trevliga funktioner i Swagger, som en f\u00e4rdig portal <noindex><a rel=\"nofollow\" href=\"https:\/\/editor.swagger.io\">editor.swagger.io<\/a><\/noindex>, som man kan ladda upp en anm\u00e4lan till och f\u00e5 en visuell presentation med detaljerad beskrivning, l\u00e4nkar och relationer, s\u00e5 finns det inte samma m\u00f6jlighet f\u00f6r den mer fundamentala och mindre anv\u00e4ndarv\u00e4nliga RAML. Ja, man kan s\u00f6ka efter n\u00e5got bland projekten p\u00e5 GitHub, hitta en motsvarighet d\u00e4r och sj\u00e4lv st\u00e4lla in det. I vilket fall m\u00e5ste n\u00e5gon underh\u00e5lla portalen, vilket inte \u00e4r s\u00e5 bekv\u00e4mt f\u00f6r grundl\u00e4ggande anv\u00e4ndning eller testbehov. Dessutom \u00e4r swagger mer \"principl\u00f6s\", eller liberal - den kan genereras fr\u00e5n kommentarer i koden, vilket f\u00f6rst\u00e5s strider mot principen API first och st\u00f6ds inte av n\u00e5got av verktygen f\u00f6r RAML.<\/p>\n<p>Vi b\u00f6rjade vid ett tillf\u00e4lle arbeta med RAML, eftersom det var ett mer flexibelt spr\u00e5k, och slutade med att vi fick g\u00f6ra mycket sj\u00e4lva. Till exempel anv\u00e4nds ett verktyg i ett av projekten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spotify\/ramlfications\">ramlfications<\/a><\/noindex> i enhetstester som endast st\u00f6der RAML 0.8. S\u00e5 vi var tvungna att l\u00e4gga till l\u00f6sningar f\u00f6r att verktyget skulle kunna \"\u00e4ta\" RAML version 1.0.<\/p>\n<h3>\u00c4r det verkligen n\u00f6dv\u00e4ndigt att v\u00e4lja?<\/h3>\n<p>\nEfter att ha k\u00e4mpat med att komplettera l\u00f6sningssystemet f\u00f6r RAML, kom vi fram till att vi beh\u00f6ver konvertera RAML till Swagger 2 och utf\u00f6ra all automatisering, validering, testning och efterf\u00f6ljande optimering d\u00e4r. Det \u00e4r ett bra s\u00e4tt att anv\u00e4nda b\u00e5de flexibiliteten hos RAML och verktygsst\u00f6det fr\u00e5n communityn som Swagger erbjuder. <\/p>\n<p>F\u00f6r att l\u00f6sa denna uppgift finns det tv\u00e5 OpenSource-verktyg som ska s\u00e4kerst\u00e4lla konverteringen av kontrakt:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mulesoft\/oas-raml-converter\">oas-raml-converter<\/a><\/noindex> \u2013 numera en icke-underh\u00e5llen verktyg. Under arbetet med det uppt\u00e4ckte vi att det uppst\u00e5r ett antal problem med komplexa RAML-filer som \u00e4r \"spridda\" \u00f6ver ett stort antal filer. Detta program \u00e4r skrivet i JavaScript och utf\u00f6r en rekursiv genomg\u00e5ng av syntaxtr\u00e4det. P\u00e5 grund av dynamisk typning blev det sv\u00e5rt att f\u00f6rst\u00e5 denna kod, s\u00e5 vi beslutade att inte sl\u00f6sa tid p\u00e5 att skriva patchar till ett utd\u00f6ende verktyg.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/raml-org\/webapi-parser\">webapi-parser<\/a><\/noindex> \u2014 ett verktyg fr\u00e5n samma f\u00f6retag som p\u00e5st\u00e5r sig kunna konvertera allt och alla, i vilken riktning som helst. I dagsl\u00e4get deklareras st\u00f6d f\u00f6r RAML 0.8, RAML 1.0 och Swagger 2.0. Men vid tidpunkten f\u00f6r v\u00e5r unders\u00f6kning var verktyget fortfarande <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aml-org\/amf\/issues\/517\">EXTREMT<\/a><\/noindex> r\u00e5tt och ol\u00e4mpligt f\u00f6r anv\u00e4ndning. Utvecklarna skapar en sorts <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Intermediate_representation\">IR<\/a><\/noindex>, vilket kommer att g\u00f6ra det m\u00f6jligt f\u00f6r dem att snabbt l\u00e4gga till nya standarder i framtiden. Men f\u00f6r tillf\u00e4llet fungerar allt detta helt enkelt inte.<\/li>\n<\/ol>\n<p>\nOch det \u00e4r inte allt besv\u00e4r vi har st\u00e5tt inf\u00f6r. Ett av stegen i v\u00e5r pipeline \u00e4r att kontrollera att RAML fr\u00e5n f\u00f6rr\u00e5det \u00e4r korrekt i f\u00f6rh\u00e5llande till specifikationen. Vi har provat flera verktyg. F\u00f6rv\u00e5nande nog klagade alla p\u00e5 v\u00e5ra anteckningar p\u00e5 olika st\u00e4llen med helt olika dumma ord. Ofta utan att ha n\u00e5gon po\u00e4ng :).<\/p>\n<p>Till slut best\u00e4mde vi oss f\u00f6r ett numera f\u00f6r\u00e5ldrat projekt, som ocks\u00e5 har en rad problem (den kraschar ibland utan anledning, har problem med regex). D\u00e4rmed hittade vi inget s\u00e4tt att l\u00f6sa validering och konvertering med hj\u00e4lp av gratisverktyg, och beslutade att anv\u00e4nda ett kommersiellt verktyg. I framtiden, n\u00e4r OpenSource-verktyg blir mer avancerade, kan det h\u00e4r problemet kanske bli enklare. Men f\u00f6r tillf\u00e4llet verkar arbets- och tidskostnaderna f\u00f6r att \"f\u00f6rb\u00e4ttra\" vara mer betydande \u00e4n kostnaden f\u00f6r den kommersiella tj\u00e4nsten.<\/p>\n<h3>Slutsats<\/h3>\n<p>\nEfter allt detta ville vi dela med oss av v\u00e5r erfarenhet och p\u00e5peka att innan man v\u00e4ljer ett verktyg f\u00f6r att beskriva kontrakt, beh\u00f6ver man tydligt definiera vad man vill ha ut av det och vilken budget man \u00e4r beredd att investera. Om man bortser fr\u00e5n OpenSource, finns det redan m\u00e5nga tj\u00e4nster och produkter som kan hj\u00e4lpa till med kontroll, konvertering och validering. Men de \u00e4r dyra, ibland mycket dyra. F\u00f6r stora f\u00f6retag \u00e4r s\u00e5dana kostnader acceptabla, men f\u00f6r startups kan de bli en stor belastning.<\/p>\n<p>Definiera de verktyg du kommer att anv\u00e4nda senare. Till exempel, om du bara beh\u00f6ver visa kontrakt, \u00e4r det enklare att anv\u00e4nda Swagger 2, som har ett snyggt API, eftersom du sj\u00e4lv m\u00e5ste driva och underh\u00e5lla tj\u00e4nsten f\u00f6r RAML.<br \/>\nJu fler uppgifter du har, desto st\u00f6rre blir behovet av verktyg, och de \u00e4r olika f\u00f6r olika plattformar. Det \u00e4r b\u00e4ttre att bekanta sig med tillg\u00e4ngliga versioner direkt f\u00f6r att g\u00f6ra ett val som minimerar dina framtida kostnader.<\/p>\n<p>Men det m\u00e5ste erk\u00e4nnas att alla ekosystem som finns idag \u00e4r ofullkomliga. S\u00e5 om det finns fans inom f\u00f6retaget som \u00e4lskar att arbeta i RAML eftersom \"det till\u00e5ter en mer flexibel uttrycksf\u00f6rm\u00e5ga\", eller tv\u00e4rtom f\u00f6redrar Swagger eftersom \"det \u00e4r mer begripligt\", \u00e4r det b\u00e4st att l\u00e5ta dem arbeta i det de \u00e4r vana vid och vill, eftersom verktygen f\u00f6r vilket av formaten som helst kr\u00e4ver finslipning. <\/p>\n<p>N\u00e4r det g\u00e4ller v\u00e5r erfarenhet kommer vi i f\u00f6ljande inl\u00e4gg att ber\u00e4tta om vilka statiska och dynamiska kontroller vi genomf\u00f6r baserat p\u00e5 v\u00e5r RAML-Swagger-arkitektur, samt vilken dokumentation vi genererar fr\u00e5n kontrakten och hur allt detta fungerar.<\/p>\n<p class=\"for_users_only_msg\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Vilket spr\u00e5k anv\u00e4nder ni f\u00f6r att annotera mikrotj\u00e4nstkontrakt?<\/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>                    Annat<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Anv\u00e4nder inte<\/p>\n<\/li>\n<\/ul>\n<p>    100 anv\u00e4ndare r\u00f6stade. 24 anv\u00e4ndare avstod.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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, \u00e4r det RAML eller OAS (Swagger)? | ProHoster","description":"I den dynamiska v\u00e4rlden av mikrotj\u00e4nster kan allt f\u00f6r\u00e4ndras - vilken komponent som helst kan skrivas om p\u00e5 ett annat spr\u00e5k med hj\u00e4lp av olika ramverk och arkitekturer.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/tak-vse-taki-raml-ili-oas-swagger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/38022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=38022"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/38022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/28540"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=38022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=38022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=38022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}