{"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\/da\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"Skriver API \u2014 smadrer XML (to)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Den f\u00f8rste API fra MitLager blev lanceret for 10 \u00e5r siden. I hele denne tid har vi arbejdet p\u00e5 de eksisterende versioner af API'et og udviklet nye. Og flere versioner af API'et er allerede blevet begravet. <\/p>\n<p>I denne artikel vil der v\u00e6re meget: hvordan API'et blev skabt, hvorfor det er n\u00f8dvendigt for cloudtjenesten, hvad det giver brugerne, hvilke udfordringer vi har m\u00f8dt, og hvad vi \u00f8nsker at g\u00f8re fremadrettet. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMit navn er Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, jeg er teknisk direkt\u00f8r og medstifter af MitLager. <\/p>\n<h2>Hvorfor lave API til servicen<\/h2>\n<p>\nVores kunder, som er titusindvis af iv\u00e6rks\u00e6ttere, bruger aktivt cloudl\u00f8sninger: banktjenester, webshops, vareh\u00e5ndtering, CRM. N\u00e5r man f\u00f8rst er tilsluttet \u00e9n, er det allerede sv\u00e6rt at stoppe. Og s\u00e5 er der den femte, ottende, tiende tjeneste, der g\u00f8r iv\u00e6rks\u00e6tterens arbejde lettere, men brugerne overf\u00f8rer stadig data mellem disse cloudtjenester manuelt. Det bliver til et mareridt.<\/p>\n<p>Den \u00e5benlyse l\u00f8sning er at give brugerne mulighed for at overf\u00f8re data mellem cloudtjenester. For eksempel at importere og eksportere data som filer, der derefter kan uploades til den \u00f8nskede tjeneste. Filene tilpasses normalt formatet for hver tjeneste. Det er mere eller mindre et simpelt manuelt arbejde, men med stigende antal af disse tjenester bliver det blot sv\u00e6rere at udf\u00f8re.<\/p>\n<p>Derfor er det n\u00e6ste skridt \u2014 API. Med det vinder cloudtjenesten ved at forbinde flere tjenester p\u00e5 \u00e9t sted. Fremkomsten af et s\u00e5dant \u00f8kosystem tiltr\u00e6kker nye kunder p\u00e5 grund af de ekstra muligheder. Et produkt med nye funktioner bliver mere attraktivt og nyttigt.<\/p>\n<p>Hvis man laver egne programmeringsgr\u00e6nseflader, tiltr\u00e6kker det eksterne s\u00e6lgere i form af programm\u00f8rer, der kender dit produkt gennem API'et. De begynder at bygge l\u00f8sninger baseret p\u00e5 det foresl\u00e5ede API og tjener penge p\u00e5 at automatisere deres kunders opgaver.<\/p>\n<p>Mit MyStocks regnskabssystem bygger p\u00e5 enkle processer. Det vigtigste er arbejdet med prim\u00e6re dokumenter, muligheden for at modtage og afsende varer, samt at f\u00e5 rapporter til virksomheden baseret p\u00e5 disse dokumenter. Derudover er der dataoverf\u00f8rsel, f.eks. til cloud-bogholderi, og modtagelse af data fra banksystemer eller detailpunkter. Vi arbejder ogs\u00e5 med internetbutikker: vi modtager oplysninger om varer og sender data om lagerbeholdninger.<\/p>\n<p><img decoding=\"async\" alt=\"Skriver API \u2014 smadrer XML (to)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Den f\u00f8rste API fra MyStocks<\/h2>\n<p>\nI l\u00f8bet af de 10 \u00e5r, hvor MyStocks har arbejdet med API, har vi opbygget mange integrationer, der muligg\u00f8r dataudveksling, bankbehandling, betalinger og brugen af ekstern telefoni.<\/p>\n<p>I det f\u00f8rste \u00e5r gjorde vi det muligt at eksportere enhver data i XML-format. P\u00e5 det tidspunkt var det meget nemmere og mere sikkert for brugerne at holde data offline end i en eller anden sky, og vi gav dem denne mulighed. Eksporten blev startet manuelt fra gr\u00e6nsefladen. S\u00e5 API kunne man ikke kalde det endnu. <\/p>\n<p>Dengang begyndte vi ogs\u00e5 samarbejde med Rusagro \u2014 de brugte allerede en 'moden' ERP til planl\u00e6gning af produktion og salg, men automatiserede lastningen af vognene p\u00e5 fabrikkerne med MyStocks. S\u00e5ledes fik vi de f\u00f8rste sp\u00e6de skridt hen imod et rigtigt API: udvekslingen mellem vores service og ERP-en fandt sted ved at sende en stor fil med data om alle dokumenttyper. <\/p>\n<p>Dette er en god l\u00f8sning til batchdataudveksling, men sammen med dokumenterne m\u00e5tte afh\u00e6ngigheder overf\u00f8res: oplysninger om varer, kunder og lagre. S\u00e5dan en sammenblanding er ikke sv\u00e6r at generere ved eksport, men ret sv\u00e6r at afkode ved import, da alle oplysninger kommer i en pakke: b\u00e5de om nye dokumenter og om eksisterende.<\/p>\n<p>Den f\u00f8rste XML API levede ikke l\u00e6nge \u2014 efter to \u00e5r begyndte vi at ombygge den. Allerede fra starten af dens drift gjorde vi flere fejl i opbygningen af det programmerbare interface.<\/p>\n<p><img decoding=\"async\" alt=\"Skriver API \u2014 smadrer XML (to)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>S\u00e5dan blev XML API bygget: illustration fra en af vores arkitekter. For \u00f8vrigt, hold \u00f8je med hans artikler.<\/i><\/p>\n<p>Her er vores hovedfejl:<\/p>\n<ol>\n<li>JAXB-annoteringen blev lavet direkte p\u00e5 entitetsb\u00f8nner. For at kommunikere med databasen bruger vi Hibernate, og de samme b\u00f8nner blev annoteret med JAXB. Denne fejl dukker n\u00e6sten med det samme op: enhver opdatering af datagrundlaget f\u00f8rte til behovet for straks at informere alle, der bruger API'et, eller konstruktion af hurtige l\u00f8sninger, der kunne sikre kompatibilitet med den tidligere datastruktur.<\/li>\n<li>API'et opstod som en slags supplement, og oprindeligt definerede vi ikke, hvilken del af produktet det udg\u00f8r. Vi overvejede heller ikke, om API'et var noget vigtigt, og om det var n\u00f8dvendigt at opretholde bagudkompatibilitet for de f\u00f8rste kunder. P\u00e5 et tidspunkt udgjorde antallet af API-brugere omkring 5% af det samlede lille antal, og vi gav dem ikke meget opm\u00e6rksomhed. Den universelle filtrering, vi tidligere havde lavet, f\u00f8rte til, at vi blev brugt som backend. Denne filtrering var slet ikke GraphQL, men noget i den stil \u2014 den fungerede gennem en masse parametre i foresp\u00f8rgselsstrengen. Med et s\u00e5 kraftigt v\u00e6rkt\u00f8j var det sv\u00e6rt for brugerne at holde sig v\u00e6k, og foresp\u00f8rgslerne blev sendt direkte fra deres e-handelsplatforms brugergr\u00e6nseflade. Situationen blev en ubehagelig overraskelse, fordi levering af en s\u00e5dan tjeneste burde kr\u00e6ve en anden priss\u00e6tning og generelt en anden forst\u00e5else af selve API'et som produkt.<\/li>\n<li>Fordi API'et ikke udviklede sig som et hovedprodukt, blev dokumentationen til API'et udarbejdet og offentliggjort som en restl\u00f8sning \u2014 gennem reverse engineering. Denne metode synes at v\u00e6re temmelig enkel og praktisk, men strider imod arbejde efter kontrakt. Det er, n\u00e5r der er en bestemt komponent med en foruddefineret arbejdsgang. Udvikleren implementerer den i overensstemmelse med denne skitse og opgaven, komponenten gennemg\u00e5r testning, kunden f\u00e5r et produkt, der svarer til analytikerens intentioner. Reverse engineering kaster derimod et produkt ud p\u00e5 markedet, som bare findes: med hurtige l\u00f8sninger, m\u00e6rkelige beslutninger og un\u00f8dvendige funktionaliteter i stedet for den \u00f8nskede funktionalitet. <\/li>\n<li>Hele str\u00f8mmen af foresp\u00f8rgsler, der kom gennem API'en, kunne kun analyseres som en Nginx-log eller fra applikationens server. Dette gjorde det umuligt at identificere emneomr\u00e5der, bortset fra at opdele efter brugere og abonnenter. Hvis der ikke er mulighed for at regulere registreringen af applikationen eller kunderne, bliver det umuligt at analysere situationen. Dette problem havde mindst indflydelse p\u00e5 udviklingen af API'en; det handlede mere om at forst\u00e5 dens eftersp\u00f8rgsel og funktionsindhold.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fors\u00f8g nummer to: REST API<\/h2>\n<p>\nI 2010 fors\u00f8gte vi at opbygge et udvekslingssystem med online regnskabsprogrammet \u2013 BuchSoft. Det lykkedes ikke. Men i integrationsprocessen blev der skabt et komplet API: en REST-udvekslingstjeneste, hvor der ikke var friheder som kald til operationer i form af RPC-opkald. Al kommunikation med API'en blev standardiseret til REST-formatet: foresp\u00f8rgselslinjen indeholder navnet p\u00e5 entiteten, og den operation, der udf\u00f8res, bestemmes ved hj\u00e6lp af HTTP-metoden. Vi tilf\u00f8jede filtrering efter opdateringstidspunktet for entiteterne, hvilket gav brugerne mulighed for at bygge replikation med deres egne systemer.<\/p>\n<p>I samme \u00e5r blev der introduceret et API til eksport af lager- og varelagerdata. Gennem API'en blev de mest v\u00e6rdifulde dele af systemet tilg\u00e6ngelige for brugerne \u2013 udveksling af prim\u00e6re dokumenter og beregningsdata vedr\u00f8rende lagrene og omkostningerne af varer.<\/p>\n<p>I december 2015 offentliggjorde RetailCRM det f\u00f8rste tredjepartsbibliotek til adgang til vores API. Det blev brugt aktivt, samtidig voksede tjenestens popularitet generelt, og belastningen p\u00e5 API'en voksede hurtigere end belastningen p\u00e5 webgr\u00e6nsefladen. En dag blev v\u00e6ksten til en belastningsspid. <\/p>\n<p><img decoding=\"async\" alt=\"Skriver API \u2014 smadrer XML (to)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Skriver API \u2014 smadrer XML (to)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg denne spid, som pilen til venstre viser, for\u00e5rsagede total forbl\u00f8ffelse hos serveren, der betjente vores API. I en uge pr\u00f8vede vi at finde ud af, hvad pr\u00e6cist denne belastning genererede. Det viste sig, at det var de samme foresp\u00f8rgsler, der blev transmitteret til vores API fra frontend'en hos kunderne. Omkring 50 kunder stod for det hele. Her inds\u00e5 vi en af vores fejl \u2013 fuldst\u00e6ndig mangel p\u00e5 gr\u00e6nser. <\/p>\n<p>Som f\u00f8lge heraf har vi indf\u00f8rt en gr\u00e6nse for antallet af samtidige foresp\u00f8rgsler. Fra \u00e9n konto kan man nu \u00e5bne h\u00f8jst to foresp\u00f8rgsler ad gangen. Det er tilstr\u00e6kkeligt til at arbejde i reproduktionsmode for dataudveksling i batchmode. De, der \u00f8nskede at bruge os som backend, m\u00e5tte \u00f8ge deres overensstemmelse med priserne, da de indf\u00f8rte brugen af flere konti i deres software.<\/p>\n<h2>Bringer orden<\/h2>\n<p>\nSiden 2014 er eftersp\u00f8rgslen efter den eksisterende API blevet en vigtig del af forretningen, og selve API'en har genereret den st\u00f8rste m\u00e6ngde data i udvekslingen med kunderne. I 2015 lancerede vi projektet for at bringe API'en i orden. Vi valgte JSON som format i stedet for XML og begyndte at bygge det ud fra de funktioner, vi havde identificeret ved implementeringen af den tidligere version:<\/p>\n<ol>\n<li>Mulighed for versionering. Versionering g\u00f8r det muligt at udvikle en ny version uden at p\u00e5virke den eksisterende applikation og uden at forstyrre brugerens arbejde. <\/li>\n<li>Mulighed for brugeren at se metadata i svaret, som de modtager.<\/li>\n<li>Mulighed for at udveksle store dokumenter. Hvis vi behandler et dokument med mere end 4-5 tusinde poster, bliver det et problem for serveren: lange transaktioner, lange http-foresp\u00f8rgsler. Vi har bygget en s\u00e6rlig mekanisme, der muligg\u00f8r at opdatere dokumentet i dele og h\u00e5ndtere individuelle poster i dokumentet ved at sende dem til serveren.<\/li>\n<li>V\u00e6rkt\u00f8jer til replikation - der var ogs\u00e5 i den tidligere version.<\/li>\n<li>Belastningsgr\u00e6nser - som et resultat af tidligere problemer, som vi st\u00f8dte p\u00e5 i den tidligere version. Vi har indf\u00f8rt gr\u00e6nser for antal foresp\u00f8rgsler i en given tidsramme, antal parallelle foresp\u00f8rgsler og foresp\u00f8rgsler fra \u00e9n ip-adresse.<\/li>\n<\/ol>\n<p>\nSiden da har vi udgivet to mindre versioner af API'en og lanceret flere specialiserede API'er, men den overordnede tilgang er forblevet u\u00e6ndret. Den opdaterede udvekslingsformat og den nye arkitektur har gjort det muligt at rette mangler i API'en hurtigere.<\/p>\n<h2>API'en fra MojeLager i dag<\/h2>\n<p>\nI dag l\u00f8ser API'en fra MojeLager mange opgaver:<\/p>\n<ul>\n<li>dataudveksling med webshops, regnskabssystemer, banker;<\/li>\n<li>f\u00e5 beregningsdata, rapporter;<\/li>\n<li>bruge som backend til klientapplikationer - vores mobile applikationer og desktopkassen arbejder gennem API'en.<\/li>\n<li>afsendelse af notifikationer om \u00e6ndringer i data i MinLager - webhooks;<\/li>\n<li>telefoni;<\/li>\n<li>loyalitetssystemer.<\/li>\n<\/ul>\n<p>\nBaseret p\u00e5 API har vores direkt\u00f8r Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> p\u00e5 fire timer skrev en telegram-bot, der henter lagerbeholdninger 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 er det blot t\u00f8rre tal. <\/p>\n<p>Her er vores statistik for det gamle REST API:<\/p>\n<ul>\n<li>400 virksomheder;<\/li>\n<li>600 brugere;<\/li>\n<li>2 millioner foresp\u00f8rgsler om dagen;<\/li>\n<li>200 GB\/dag udg\u00e5ende trafik.<\/li>\n<\/ul>\n<p>\nOg her er, hvad vi er n\u00e5et frem til med alle API'er fra MinLager:<\/p>\n<ul>\n<li>mere end 70 integrationer (nogle af dem kan ses her <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integrationer<\/a><\/noindex>);<\/li>\n<li>8500 virksomheder;<\/li>\n<li>12.000 brugere;<\/li>\n<li>46 millioner foresp\u00f8rgsler om dagen;<\/li>\n<li>2 TB\/dag udg\u00e5ende trafik.<\/li>\n<\/ul>\n<p><\/p>\n<h2>vil v\u00e6re udsolgt<\/h2>\n<p>\nPlanerne for udvikling af API'et er aktivt under diskussion. Vi fors\u00f8ger at tage hensyn til brugeroplevelsen, som vores brugere giver os. Det er ikke altid muligt at g\u00f8re alt med det samme, men en ny version af API'et med mere brugervenlige metadata og en mindre kompliceret struktur, OAuth til autentifikation og API til indlejrede applikationsinterfacer er n\u00e6rt forest\u00e5ende. <\/p>\n<p>Du kan f\u00f8lge nyhederne p\u00e5 den specielle hjemmeside for udviklere af integrationer med MinLager: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.moysklad.ru<\/a><\/noindex>.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\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\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\/da\/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\udd47Skriver API \u2014 splittede XML (to) | ProHoster","description":"Den f\u00f8rste API fra MitLager blev lanceret for 10 \u00e5r siden. I hele denne tid har vi arbejdet p\u00e5 de eksisterende versioner af API'et og udviklet nye. Og flere versioner af API'et er allerede blevet begravet.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","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\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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/34354","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=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}