{"id":34354,"date":"2019-10-31T21:57:51","date_gmt":"2019-10-31T18:57:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/pisali-api-porvali-xml-dva\/"},"modified":"2019-10-31T21:57:51","modified_gmt":"2019-10-31T18:57:51","slug":"pisali-api-porvali-xml-dva","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"Skrivna API \u2014 spr\u00e4ngde XML (tv\u00e5)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Den f\u00f6rsta API:n f\u00f6r MojeLager lanserades f\u00f6r 10 \u00e5r sedan. Under hela denna tid har vi arbetat med befintliga versioner av API:t och utvecklat nya. Flera versioner av API:t har redan blivit f\u00f6r\u00e5ldrade. <\/p>\n<p>I den h\u00e4r artikeln finns det mycket att ta upp: hur vi skapade API:t, varf\u00f6r det beh\u00f6vs f\u00f6r molntj\u00e4nsten, vad det ger anv\u00e4ndarna, vilka fallgropar vi har st\u00f6tt p\u00e5 och vad vi vill g\u00f6ra fram\u00f6ver. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJag heter Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, jag \u00e4r teknisk chef och medgrundare av MojeLager. <\/p>\n<h2>Varf\u00f6r g\u00f6ra ett API f\u00f6r tj\u00e4nsten<\/h2>\n<p>\nV\u00e5ra kunder, som best\u00e5r av tiotusentals entrepren\u00f6rer, anv\u00e4nder aktivt molnl\u00f6sningar: banktj\u00e4nster, n\u00e4tbutiker, lagerhantering, CRM. N\u00e4r man ansluter till en tj\u00e4nst \u00e4r det sv\u00e5rt att stoppa d\u00e4r. Och nu g\u00f6r den femte, \u00e5ttonde, tionde tj\u00e4nsten arbetet enklare f\u00f6r entrepren\u00f6ren, men data mellan dessa molntj\u00e4nster \u00f6verf\u00f6rs manuellt av anv\u00e4ndarna. Arbetet blir en mardr\u00f6m.<\/p>\n<p>Den uppenbara l\u00f6sningen \u00e4r att ge anv\u00e4ndarna m\u00f6jlighet att \u00f6verf\u00f6ra data mellan molntj\u00e4nster. Till exempel att importera och exportera data som filer, som sedan kan laddas upp till den \u00f6nskade tj\u00e4nsten. Filerna anpassas vanligtvis till formatet f\u00f6r varje tj\u00e4nst. Detta \u00e4r mer eller mindre enkelt manuellt arbete, men med antalet tj\u00e4nster som v\u00e4xer blir det allt mer komplicerat att utf\u00f6ra.<\/p>\n<p>S\u00e5 n\u00e4sta steg \u00e4r API:t. Med det vinner molntj\u00e4nsten p\u00e5 att koppla ihop flera tj\u00e4nster p\u00e5 en och samma plats. Framv\u00e4xten av ett s\u00e5dant ekosystem attraherar nya kunder tack vare ytterligare m\u00f6jligheter. En produkt med nya funktioner blir mer l\u00f6nsam och anv\u00e4ndbar.<\/p>\n<p>Om man skapar egna API:er, drar det till sig externa f\u00f6rs\u00e4ljare som programmerare som k\u00e4nner till din produkt tack vare API:t. De b\u00f6rjar bygga l\u00f6sningar baserade p\u00e5 API:t och tj\u00e4nar pengar p\u00e5 att automatisera sina kunders uppgifter.<\/p>\n<p>Redovisningssystemet f\u00f6r MojeLager bygger p\u00e5 enkla processer. Det centrala \u00e4r att arbeta med prim\u00e4ra dokument, m\u00f6jligheten att hantera mottagning och avskickning av varor, och att f\u00e5 rapporter f\u00f6r verksamheten baserat p\u00e5 dessa dokument. Det finns \u00e4ven data\u00f6verf\u00f6ring, till exempel till molnbaserad bokf\u00f6ring, och att f\u00e5 data fr\u00e5n banksystem eller detaljhandelspunkter. Dessutom arbetar vi med n\u00e4tbutiker: vi f\u00e5r information om produkter och skickar data om lagret.<\/p>\n<p><img decoding=\"async\" alt=\"Skrivna API \u2014 spr\u00e4ngde XML (tv\u00e5)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>F\u00f6rsta API:et f\u00f6r MojeSkalad<\/h2>\n<p>\nUnder de 10 \u00e5r som MojeSkalad har arbetat med API:er har vi byggt upp olika integrationer som l\u00e5ter oss utbyta data, arbeta med banker, genomf\u00f6ra betalningar och anv\u00e4nda extern telefoni.<\/p>\n<p>Under det f\u00f6rsta \u00e5ret gjorde vi det m\u00f6jligt att exportera alla data i XML-format. D\u00e5 var det mycket mer f\u00f6rst\u00e5eligt och bekv\u00e4mt f\u00f6r anv\u00e4ndarna att ha data offline ist\u00e4llet f\u00f6r i n\u00e5gon typ av moln, och vi gav dem den m\u00f6jligheten. Exporten initierades genom manuell export fr\u00e5n gr\u00e4nssnittet. S\u00e5 det gick \u00e4nnu inte att kalla det f\u00f6r ett API. <\/p>\n<p>Samma \u00e5r b\u00f6rjade vi samarbeta med f\u00f6retaget Rusagro \u2014 de anv\u00e4nde redan en \"vuxen\" ERP f\u00f6r produktions- och f\u00f6rs\u00e4ljningsplanering, medan de automatiserade lastningen av vagnar p\u00e5 fabrikerna i MojeSkalad. S\u00e5 vi fick v\u00e5ra f\u00f6rsta embryo av ett riktigt API: utbytet mellan v\u00e5r tj\u00e4nst och ERP:n skedde genom att skicka en stor fil med data f\u00f6r alla typer av dokument. <\/p>\n<p>Detta var en bra l\u00f6sning f\u00f6r batchdatautbyte, men tillsammans med dokumenten var vi tvungna att \u00f6verf\u00f6ra deras beroenden: information om varor, motparter och lager. En s\u00e5dan samling \u00e4r inte sv\u00e5r att generera vid export, men ganska sv\u00e5r att bearbeta vid import, eftersom all information kommer i ett paket: b\u00e5de om nya dokument och redan existerande.<\/p>\n<p>Det f\u00f6rsta XML API:et levde inte l\u00e4nge \u2014 efter tv\u00e5 \u00e5r b\u00f6rjade vi bygga om det. Redan i b\u00f6rjan av dess drift gjorde vi flera misstag vid utformningen av det programmeringsgr\u00e4nssnittet.<\/p>\n<p><img decoding=\"async\" alt=\"Skrivna API \u2014 spr\u00e4ngde XML (tv\u00e5)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>S\u00e5 h\u00e4r gjordes XML API:et: en illustration av en av v\u00e5ra arkitekter. F\u00f6rresten, se fram emot hans artiklar.<\/i><\/p>\n<p>H\u00e4r \u00e4r v\u00e5ra huvudmisstag:<\/p>\n<ol>\n<li>JAXB-m\u00e4rkningen gjordes direkt p\u00e5 entity beans. F\u00f6r att kommunicera med databasen anv\u00e4nder vi Hibernate, och denna JAXB-m\u00e4rkning gjordes ocks\u00e5 p\u00e5 dessa b\u00f6nor. Detta misstag uppenbarade sig n\u00e4stan omedelbart: varje uppdatering av databasstrukturen kr\u00e4vde ett akut meddelande till alla som anv\u00e4nder API:et, eller att bygga tempor\u00e4ra l\u00f6sningar f\u00f6r att s\u00e4kerst\u00e4lla kompatibilitet med den tidigare databasstrukturen.<\/li>\n<li>API utvecklades som ett slags till\u00e4gg, och vi definierade ursprungligen inte vilken del av produkten det utgjorde. Vi t\u00e4nkte inte heller p\u00e5 huruvida API:t var n\u00e5got viktigt, eller om vi beh\u00f6vde st\u00f6dja bak\u00e5tkompatibilitet f\u00f6r de f\u00f6rsta kunderna. Under en tid utgjorde antalet API-anv\u00e4ndare cirka 5 % av det totala lilla antalet, och vi uppm\u00e4rksammade dem inte. Den universella filtrering som gjordes vid den tiden ledde till att vi b\u00f6rjade anv\u00e4ndas som backend. Denna filtrering var inte riktigt GraphQL, men n\u00e5got liknande \u2013 den fungerade genom en m\u00e4ngd parametrar i fr\u00e5gestr\u00e4ngen. Med ett s\u00e5 kraftfullt verktyg var det sv\u00e5rt f\u00f6r anv\u00e4ndare att h\u00e5lla sig borta, och f\u00f6rfr\u00e5gningar b\u00f6rjade skickas direkt fr\u00e5n UI:n i deras e-handelsbutiker. Situationen blev en obehaglig \u00f6verraskning, eftersom tillhandah\u00e5llandet av en s\u00e5dan tj\u00e4nst skulle kr\u00e4va en annan priss\u00e4ttning och \u00f6verhuvudtaget en annan f\u00f6rst\u00e5else av API:t som produkt.<\/li>\n<li>Eftersom API:t inte utvecklades som en huvudprodukt, producerades och publicerades dokumentationen om API:t som en biprodukt \u2013 genom reverse engineering. Denna v\u00e4g verkar ganska enkel och bekv\u00e4m, men den strider mot kontraktsarbetet. Det handlar om att ha en komponent med en f\u00f6rutbest\u00e4md arbetsmodell. Utvecklaren implementerar den enligt denna modell och uppgift, komponenten genomg\u00e5r tester, och kunden f\u00e5r en produkt som \u00f6verensst\u00e4mmer med analytikerns avsikt. \u00c5 andra sidan sl\u00e4pper reverse engineering en produkt p\u00e5 marknaden som helt enkelt finns: med provisoriska l\u00f6sningar, konstiga tillv\u00e4gag\u00e5ngss\u00e4tt och hemgjorda l\u00f6sningar ist\u00e4llet f\u00f6r den \u00f6nskade funktionaliteten. <\/li>\n<li>Hela fl\u00f6det av f\u00f6rfr\u00e5gningar som kom genom API:t kunde bara analyseras som en logg fr\u00e5n Nginx eller applikationsservern. Detta gjorde det om\u00f6jligt att s\u00e4rskilja \u00e4mnesomr\u00e5den, f\u00f6rutom att bryta ner efter anv\u00e4ndare och prenumeranter. Om det inte finns m\u00f6jlighet att reglera registrering av applikationer eller kunder blir det om\u00f6jligt att analysera situationen. Detta problem p\u00e5verkade utvecklingen av API:t i minsta m\u00e5n; det handlar mer om att f\u00f6rst\u00e5 dess efterfr\u00e5gan och funktionalitet.<\/li>\n<\/ol>\n<p><\/p>\n<h2>F\u00f6rs\u00f6k nummer tv\u00e5: REST API<\/h2>\n<p>\n\u00c5r 2010 f\u00f6rs\u00f6kte vi bygga ett utbytesystem med online-bokf\u00f6ringen \u2013 BukhSoft. Det gick inte v\u00e4gen. Men under integrationsprocessen uppstod en fullfj\u00e4drad API: en REST-tj\u00e4nst f\u00f6r utbyte som inte hade n\u00e5gra avvikelser som RPC-anrop. All kommunikation med API:et var f\u00f6renad med det standardiserade REST-l\u00e4get: i f\u00f6rfr\u00e5gningsstr\u00e4ngen finns entitetens namn och operationen som g\u00f6rs med den anges med hj\u00e4lp av HTTP-metoden. Vi la till filtrering baserat p\u00e5 senaste uppdatering av entiteter, s\u00e5 att anv\u00e4ndarna fick m\u00f6jlighet att bygga replikering med sina system.<\/p>\n<p>Samma \u00e5r lanserades API:t f\u00f6r att exportera lager och produktbeholdningar. F\u00f6r anv\u00e4ndarna blev de mest v\u00e4rdefulla delarna av systemet tillg\u00e4ngliga via API:et \u2013 utbyte av prim\u00e4ra dokument och ber\u00e4kningsdata om lagerniv\u00e5er och varukostnader.<\/p>\n<p>I december 2015 publicerade RetailCRM det f\u00f6rsta tredjepartsbiblioteket f\u00f6r \u00e5tkomst till v\u00e5rt API. Det b\u00f6rjade anv\u00e4ndas ganska aktivt, och samtidigt v\u00e4xte tj\u00e4nstens popularitet som helhet, belastningen p\u00e5 API:et \u00f6kade snabbare \u00e4n belastningen p\u00e5 webbgr\u00e4nssnittet. En dag f\u00f6rvandlades tillv\u00e4xten till en belastningsspik. <\/p>\n<p><img decoding=\"async\" alt=\"Skrivna API \u2014 spr\u00e4ngde XML (tv\u00e5)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Skrivna API \u2014 spr\u00e4ngde XML (tv\u00e5)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch denna spik, som visar den v\u00e4nstra indikatoren, l\u00e4mnade servern som hanterade v\u00e5rt API i fullst\u00e4ndig f\u00f6rundran. Vi k\u00e4mpade i en vecka f\u00f6r att ta reda p\u00e5 vilken belastning som egentligen genererade detta. Det visade sig vara de beg\u00e4rningar som vidarebefordrades till v\u00e5rt API fr\u00e5n kundernas front-end. Ungef\u00e4r 50 kunder orsakade hela lasten. H\u00e4r ins\u00e5g vi ett av v\u00e5ra misstag \u2013 den fullst\u00e4ndiga avsaknaden av gr\u00e4nser. <\/p>\n<p>Som ett resultat inf\u00f6rde vi en gr\u00e4ns f\u00f6r antalet samtidiga f\u00f6rfr\u00e5gningar. Fr\u00e5n ett konto gick det nu att \u00f6ppna h\u00f6gst tv\u00e5 f\u00f6rfr\u00e5gningar samtidigt. Detta \u00e4r tillr\u00e4ckligt f\u00f6r att arbeta i replikationsl\u00e4ge f\u00f6r datautbyte i batchl\u00e4ge. De som ville anv\u00e4nda oss som backend var nu tvungna att mer anpassa sig till priss\u00e4ttningarna, eftersom de b\u00f6rjade implementera arbete med flera konton i sina programverktyg.<\/p>\n<h2>Vi s\u00e4tter i ordning<\/h2>\n<p>\nRedan fr\u00e5n 2014 blev efterfr\u00e5gan p\u00e5 det befintliga API:t en viktig del av verksamheten, och sj\u00e4lva API:t genererade den st\u00f6rsta m\u00e4ngden data i datautbytet med kunder. \u00c5r 2015 startade vi projektet med att s\u00e4tta API:t i ordning. Vi valde JSON som format ist\u00e4llet f\u00f6r XML och b\u00f6rjade bygga det baserat p\u00e5 de insikter vi fick vid implementeringen av den tidigare versionen:<\/p>\n<ol>\n<li>M\u00f6jlighet att hantera versioner. Versionshantering g\u00f6r det m\u00f6jligt att utveckla en ny version utan att p\u00e5verka den befintliga applikationen och utan att st\u00f6ra anv\u00e4ndarna. <\/li>\n<li>M\u00f6jlighet f\u00f6r anv\u00e4ndaren att se metadata i sj\u00e4lva svaret som han f\u00e5r.<\/li>\n<li>M\u00f6jlighet att byta stora dokument. Om vi hanterar ett dokument med fler \u00e4n 4-5 tusen poster blir det ett problem f\u00f6r servern: l\u00e5ng transaktion, l\u00e5ng http-f\u00f6rfr\u00e5gan. Vi har byggt en speciell mekanism som g\u00f6r det m\u00f6jligt att uppdatera dokumentet i delar och hantera individuella poster i detta dokument genom att skicka dem till servern.<\/li>\n<li>Verktyg f\u00f6r replikering \u2013 fanns \u00e4ven i tidigare version.<\/li>\n<li>Belastningsgr\u00e4nser \u2013 som ett arv av problemen vi st\u00f6tte p\u00e5 i den tidigare versionen. Vi inf\u00f6rde gr\u00e4nser f\u00f6r antalet f\u00f6rfr\u00e5gningar under en viss tidsperiod, antalet parallella f\u00f6rfr\u00e5gningar och f\u00f6rfr\u00e5gningar fr\u00e5n en och samma ip-adress.<\/li>\n<\/ol>\n<p>\nSedan dess har vi sl\u00e4ppt tv\u00e5 mindre versioner av API:et och lanserat flera specialiserade API:er, men \u00f6vergripande angreppss\u00e4tt har f\u00f6rblivit of\u00f6r\u00e4ndrat. Den uppdaterade utbytesformatet och den nya arkitekturen har m\u00f6jliggjort att \u00e5tg\u00e4rda brister i API:et mycket snabbare.<\/p>\n<h2>API f\u00f6r MinLager idag<\/h2>\n<p>\nIdag l\u00f6ser API f\u00f6r MinLager m\u00e5nga uppgifter:<\/p>\n<ul>\n<li>databyten med n\u00e4tbutiker, redovisningssystem, banker;<\/li>\n<li>h\u00e4mtning av ber\u00e4kningsdata, rapporter;<\/li>\n<li>anv\u00e4ndning som backend f\u00f6r klientapplikationer \u2013 v\u00e5ra mobilapplikationer och skrivbordsregister fungerar via API<\/li>\n<li>skickande av meddelanden om data\u00e4ndringar i MinLager \u2013 webhooks;<\/li>\n<li>telefoni;<\/li>\n<li>lojalitetssystem.<\/li>\n<\/ul>\n<p>\nBaserat p\u00e5 API:et skrev v\u00e5r VD Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> p\u00e5 fyra timmar en telegram-bot som h\u00e4mtar lager via API: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/arahimberdiev\/com-lognex-telegram-moysklad-stock\">github.com\/arahimberdiev\/com-lognex-telegram-moysklad-stock<\/a><\/noindex><\/p>\n<p>Nu torra siffror. <\/p>\n<p>H\u00e4r \u00e4r v\u00e5r statistik f\u00f6r det gamla REST API:et:<\/p>\n<ul>\n<li>400 f\u00f6retag;<\/li>\n<li>600 anv\u00e4ndare;<\/li>\n<li>2 miljoner f\u00f6rfr\u00e5gningar per dag;<\/li>\n<li>200 GB\/dag i utg\u00e5ende trafik.<\/li>\n<\/ul>\n<p>\nOch h\u00e4r \u00e4r vad vi har kommit fram till f\u00f6r alla API:er f\u00f6r MinLager:<\/p>\n<ul>\n<li>mer \u00e4n 70 integrationer (en del av dem kan du se h\u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integratsii<\/a><\/noindex>);<\/li>\n<li>8500 f\u00f6retag;<\/li>\n<li>12 000 anv\u00e4ndare;<\/li>\n<li>46 miljoner f\u00f6rfr\u00e5gningar per dag;<\/li>\n<li>2 TB\/dag i utg\u00e5ende trafik.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Vad h\u00e4nder h\u00e4rn\u00e4st<\/h2>\n<p>\nAPI-utvecklingsplaner \u00e4r under aktiv diskussion. Vi f\u00f6rs\u00f6ker ta h\u00e4nsyn till den anv\u00e4ndarerfarenhet som v\u00e5ra anv\u00e4ndare delar med oss. Det \u00e4r inte alltid m\u00f6jligt att \u00e5stadkomma allt p\u00e5 en g\u00e5ng, men en ny version av API:et med mer anv\u00e4ndarv\u00e4nlig metadata och en mindre komplicerad struktur, samt OAuth f\u00f6r autentisering och API f\u00f6r inb\u00e4ddade applikationsgr\u00e4nssnitt, \u00e4r inte l\u00e5ngt borta. <\/p>\n<p>H\u00e5ll dig uppdaterad om nyheter p\u00e5 den speciella webbplatsen f\u00f6r utvecklare av integrationer med MoimSklad: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.moysklad.ru<\/a><\/noindex>.<br \/>\n<br \/>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/moysklad\/blog\/453136\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0432\u044b\u0439 API \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 API \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435. \u0410 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 API \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043f\u043e\u0445\u043e\u0440\u043e\u043d\u0438\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e: \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 API, \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u043c\u044b \u0443\u0441\u043f\u0435\u043b\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0438 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u041c\u0435\u043d\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25898,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34354","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=\"\u041f\u0435\u0440\u0432\u044b\u0439 API \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 API \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435. \u0410 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 API \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043f\u043e\u0445\u043e\u0440\u043e\u043d\u0438\u0442\u044c.\" \/>\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\/pisali-api-porvali-xml-dva\" \/>\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\u041f\u0438\u0441\u0430\u043b\u0438 API \u2014 \u043f\u043e\u0440\u0432\u0430\u043b\u0438 XML (\u0434\u0432\u0430) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0432\u044b\u0439 API \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 API \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435. \u0410 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 API \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043f\u043e\u0445\u043e\u0440\u043e\u043d\u0438\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\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-31T18:57:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:57:51+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\udd47Skrivit API \u2013 krossat XML (tv\u00e5) | ProHoster","description":"Den f\u00f6rsta API:n f\u00f6r MojeLager lanserades f\u00f6r 10 \u00e5r sedan. Under hela denna tid har vi arbetat med befintliga versioner av API:t och utvecklat nya. Flera versioner av API:t har redan blivit f\u00f6r\u00e5ldrade.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","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\u041f\u0438\u0441\u0430\u043b\u0438 API \u2014 \u043f\u043e\u0440\u0432\u0430\u043b\u0438 XML (\u0434\u0432\u0430) | ProHoster","og:description":"\u041f\u0435\u0440\u0432\u044b\u0439 API \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 API \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435. \u0410 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 API \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043f\u043e\u0445\u043e\u0440\u043e\u043d\u0438\u0442\u044c.","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","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-31T18:57:51+00:00","article:modified_time":"2019-10-31T18:57:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34354","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-21 18:52:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:23:17","updated":"2026-01-21 18:52:24","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\/34354","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=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}