{"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\/no\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"Wrote an API \u2014 tore XML (twice)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Den f\u00f8rste API-en til MinLager ble lansert for 10 \u00e5r siden. Siden den gang har vi arbeidet med eksisterende versjoner av API-en og utviklet nye. Noen versjoner av API-en har allerede blitt lagt bort. <\/p>\n<p>I denne artikkelen vil det v\u00e6re mye innhold: hvordan API-en ble utviklet, hvorfor den er n\u00f8dvendig for en skybasert tjeneste, hva den gir brukerne, hvilke feil vi har gjort, og hva vi \u00f8nsker \u00e5 gj\u00f8re videre. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJeg heter Oleg Alexeev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, jeg er teknisk direkt\u00f8r og medstifter av MinLager. <\/p>\n<h2>Hvorfor lage API for tjenesten<\/h2>\n<p>\nKundene v\u00e5re, som omfatter titusenvis av entrepren\u00f8rer, bruker aktivt skybaserte l\u00f8sninger: banktjenester, nettbutikker, varebeholdningssystemer, CRM. N\u00e5r du kobler til \u00e9n, blir det vanskelig \u00e5 stoppe. Og n\u00e5 har den femte, \u00e5ttende, tiende tjenesten gjort entrepren\u00f8rens arbeid lettere, men dataene mellom disse skybaserte tjenestene m\u00e5 brukerne fremdeles overf\u00f8re manuelt. Arbeidet blir et mareritt.<\/p>\n<p>Det \u00e5penbare l\u00f8sningen er \u00e5 gi brukerne mulighet til \u00e5 overf\u00f8re data mellom skybaserte tjenester. For eksempel \u00e5 importere og eksportere data som filer som deretter kan lastes opp til den aktuelle tjenesten. Filer tilpasses vanligvis formatet til hver tjeneste. Dette er mer eller mindre enkel manuell arbeid, men med \u00f8kningen i antall disse tjenestene blir det mer komplisert \u00e5 h\u00e5ndtere.<\/p>\n<p>Derfor er neste steg \u2013 API. Med det f\u00e5r den skybaserte tjenesten fordelene av \u00e5 knytte flere tjenester p\u00e5 ett sted. Fremveksten av et slikt \u00f8kosystem tiltrekker nye kunder takket v\u00e6re tilleggsmuligheter. Et produkt med ny funksjonalitet blir mer kostnadseffektivt og nyttig.<\/p>\n<p>\u00c5 lage egne programmeringsgrensesnitt tiltrekker eksterne selgere i form av programmerere som kjenner produktet ditt takket v\u00e6re API. De begynner \u00e5 bygge l\u00f8sninger basert p\u00e5 det foresl\u00e5tte API og tjener penger p\u00e5 \u00e5 automatisere oppgaver for kundene sine.<\/p>\n<p>Bokf\u00f8ringssystemet til MinLager er bygget p\u00e5 enkle prosesser. Hovedsakelig dreier det seg om \u00e5 h\u00e5ndtere prim\u00e6r dokumentasjon, muligheten til \u00e5 gjennomf\u00f8re mottak og utsendelse av varer, og \u00e5 generere rapporter for bedriften basert p\u00e5 prim\u00e6rdata. Det er ogs\u00e5 dataoverf\u00f8ring, for eksempel til skybasert regnskap, samt mottak av data fra banksystemer eller detaljutsalg. I tillegg arbeider vi med nettbutikker: vi f\u00e5r informasjon om produkter og sender data om beholdningen.<\/p>\n<p><img decoding=\"async\" alt=\"Wrote an API \u2014 tore XML (twice)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>F\u00f8rste API til MinLager<\/h2>\n<p>\nI l\u00f8pet av de 10 \u00e5rene MinLager har jobbet med API, har vi samlet mange integrasjoner som gj\u00f8r det mulig \u00e5 utveksle data, arbeide med banker, gjennomf\u00f8re betalinger og bruke ekstern telefoni.<\/p>\n<p>I det f\u00f8rste \u00e5ret lagde vi muligheten til \u00e5 eksporterer alle data i XML-format. Den gangen var det mye mer vanlig og kjent for brukerne \u00e5 holde dataene offline, snarere enn i noen sky, og vi ga dem det. Eksportprosessen ble initiert via manuell eksport fra grensesnittet. Det var dermed ikke noe man kunne kalle et API. <\/p>\n<p>Samtidig begynte vi samarbeidet med selskapet Rusagro \u2013 de brukte allerede et 'modent' ERP-system for produksjons- og distribusjonsplanlegging, men automatiseringen av lasting av vognene p\u00e5 fabrikkene ble gjort i MinLager. S\u00e5 fikk vi v\u00e5re f\u00f8rste fr\u00f8 til et ekte API: utvekslingen mellom tjenesten v\u00e5r og ERP-systemet skjedde ved \u00e5 sende en stor fil med data for alle dokumenttyper. <\/p>\n<p>Dette var en grei l\u00f8sning for batch-utveksling av data, men sammen med dokumentene m\u00e5tte man ogs\u00e5 sende avhengighetene deres: informasjon om varer, kontraktsparter og lagre. \u00c5 generere en slik blanding er ikke s\u00e5 vanskelig ved eksport, men det er ganske vanskelig \u00e5 sortere den ved import, ettersom all informasjon kommer i \u00e9n pakke: b\u00e5de om nye dokumenter og om eksisterende.<\/p>\n<p>Det f\u00f8rste XML APIet levde ikke lenge \u2013 etter to \u00e5r begynte vi \u00e5 omstrukturere det. Allerede tidlig i driftsfasen gjorde vi flere feil i oppbyggingen av grensesnittet.<\/p>\n<p><img decoding=\"async\" alt=\"Wrote an API \u2014 tore XML (twice)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Slik ble XML API laget: illustrasjonen er laget av en av v\u00e5re arkitekter. Forresten, se frem til hans artikler.<\/i><\/p>\n<p>Her er v\u00e5re hovedfeil:<\/p>\n<ol>\n<li>JAXB-merking ble gjort direkte p\u00e5 entity beans. For kommunikasjon med databasen bruker vi Hibernate, og JAXB-merking ble gjort p\u00e5 de samme b\u00f8nnene. Denne feilen dukket opp nesten umiddelbart: hver oppdatering av datakonstruksjonen f\u00f8rte til at alle som brukte API m\u00e5tte varsles omg\u00e5ende, eller man m\u00e5tte lage 'klosser' som sikret kompatibilitet med den tidligere datakonstruksjonen.<\/li>\n<li>API utviklet seg som et supplement, og i starten definerte vi ikke hvilken del av produktet det utgjorde. Vi tenkte ikke over om API var viktig, eller om vi m\u00e5tte opprettholde bakoverkompatibilitet for de f\u00f8rste kundene. P\u00e5 et tidspunkt utgjorde antallet API-brukere omtrent 5% av det totale lille antallet, og vi ga dem ikke noe oppmerksomhet. Den universelle filtreringen som ble gjort tidligere f\u00f8rte til at vi ble brukt som backend. Denne filtreringen var ikke helt GraphQL, men noe lignende \u2014 det fungerte gjennom en mengde parametere i foresp\u00f8rselen. Med et s\u00e5 kraftig verkt\u00f8y var det vanskelig for brukerne \u00e5 motst\u00e5, og foresp\u00f8rslene ble sendt direkte fra UI-en til nettbutikkene deres. Situasjonen ble et ubehagelig overraskelse, fordi \u00e5 tilby en slik tjeneste burde kreve en annen prising og en helt annen forst\u00e5else av API som produkt.<\/li>\n<li>Fordi API utviklet seg ikke som et hovedprodukt, ble dokumentasjonen for API produsert og publisert p\u00e5 et etterl\u00f8pende grunnlag \u2014 gjennom reversering av ingeni\u00f8rarbeid. Denne tiln\u00e6rmingen virker ganske enkel og praktisk, men er i strid med kontraktsarbeid. Det er n\u00e5r det er en komponent med en forh\u00e5ndsbestemt arbeidsordning. Utvikleren implementerer den i henhold til denne ordningen og oppgaven, komponenten gjennomg\u00e5r testing, og kunden mottar produktet som samsvarer med analytikerenes visjon. Reversering av ingeni\u00f8rarbeid kaster imidlertid et produkt p\u00e5 markedet som bare eksisterer: med lappel\u00f8sninger, merkelige beslutninger og <\/li>\n<li>Hele str\u00f8mmen av foresp\u00f8rselene som kom gjennom API-en kunne ikke analyseres mer enn som en logg fra Nginx eller applikasjonsserveren. Dette tillot ikke \u00e5 fremheve temaomr\u00e5der, bortsett fra \u00e5 dele opp etter brukere og abonnenter. Hvis det ikke er mulighet til \u00e5 regulere registreringen av applikasjonen eller kundene, blir det umulig \u00e5 analysere situasjonen. Dette problemet p\u00e5virket p\u00e5 en minimal m\u00e5te utviklingen av API-en; det handler mer om forst\u00e5elsen av ettersp\u00f8rselen og funksjonaliteten.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fors\u00f8k nummer to: REST API<\/h2>\n<p>\nI 2010 pr\u00f8vde vi \u00e5 bygge et system for utveksling med online-regnskapet \u2013 BukhSoft. Det ble ikke vellykket. Men i prosessen med integrasjonen oppstod det et fullt API: et REST-tjeneste for utveksling, hvor det ikke var rom for unntak som RPC-kall. All kommunikasjon med API-et ble f\u00f8rt over i den standardiserte REST-modusen: i foresp\u00f8rselen er navnet p\u00e5 enheten og operasjonen som utf\u00f8res, bestemmes ved hjelp av HTTP-metoden. Vi la til filtrering etter oppdateringspunktene for enhetene, og brukerne fikk mulighet til \u00e5 bygge replikering med sine egne systemer.<\/p>\n<p>Samme \u00e5r ble det laget et API for \u00e5 eksportere lager- og varebeholdning. Gjennom API-et ble de mest verdifulle delene av systemet tilgjengelige for brukerne \u2013 utveksling av prim\u00e6r dokumentasjon og beregningsdata for beholdningene og kostnadene av varene.<\/p>\n<p>I desember 2015 publiserte RetailCRM det f\u00f8rste tredjepartsbiblioteket for tilgang til v\u00e5rt API. Det ble ganske aktivt brukt, samtidig som populariteten til tjenesten generelt vokste, og belastningen p\u00e5 API-et \u00f8kte raskere enn belastningen p\u00e5 webgrensesnittet. En gang ble veksten til et sjokk. <\/p>\n<p><img decoding=\"async\" alt=\"Wrote an API \u2014 tore XML (twice)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Wrote an API \u2014 tore XML (twice)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg dette sjokket, som pilen til venstre viser, f\u00f8rte til fullstendig forbl\u00f8ffelse av serveren som betjente v\u00e5rt API. I en uke jobbet vi med \u00e5 finne ut hva som for\u00e5rsaket denne belastningen. Det viste seg at det var nettopp de foresp\u00f8rslene som ble sendt til v\u00e5rt API fra klientenes fronter. Rundt 50 klienter skapte belastningen. Her inns\u00e5 vi en av v\u00e5re feil \u2013 den totale mangelen p\u00e5 grenser. <\/p>\n<p>Som et resultat innf\u00f8rte vi en grense for antall samtidige foresp\u00f8rsel. Fra en konto ble det n\u00e5 tillatt \u00e5 \u00e5pne maksimalt to foresp\u00f8rsel samtidig. Dette er tilstrekkelig for \u00e5 jobbe i replikasjonsmodus for datautveksling i batchmodus. De som ville bruke oss som backend, m\u00e5tte fra dette punktet mer tilpasse seg prisplanene, ettersom de innf\u00f8rte arbeid med flere kontoer i programvaren sin.<\/p>\n<h2>Orden i rekken<\/h2>\n<p>\nAllerede fra 2014 ble ettersp\u00f8rselen etter det eksisterende API-et en viktig del av virksomheten, og API-et genererte den st\u00f8rste datamengden i datautveksling med kundene. I 2015 startet vi et prosjekt for \u00e5 rydde opp i API-et. Vi valgte JSON som format i stedet for XML og begynte \u00e5 bygge det p\u00e5 grunnlag av de egenskapene vi avdekket under implementeringen av den forrige versjonen:<\/p>\n<ol>\n<li>Muligheten til \u00e5 administrere versjoner. Versjonering gj\u00f8r det mulig \u00e5 utvikle en ny versjon uten \u00e5 ber\u00f8re eksisterende applikasjoner og uten \u00e5 forstyrre brukerne. <\/li>\n<li>Muligheten for brukeren \u00e5 se metadata i svaret han f\u00e5r.<\/li>\n<li>Muligheten til \u00e5 utveksle store dokumenter. N\u00e5r vi behandler et dokument med flere enn 4-5 tusen poster, blir det et problem for serveren: lange transaksjoner, lange http-foresp\u00f8rsel. Vi har bygget en spesialmekanisme som lar oss oppdatere dokumentet del for del og h\u00e5ndtere individuelle poster i dette dokumentet ved \u00e5 sende dem til serveren.<\/li>\n<li>Verkt\u00f8y for replikasjon \u2013 var ogs\u00e5 i forrige versjon.<\/li>\n<li>Belastningsgrenser \u2013 som et resultat av problemene vi st\u00f8tte p\u00e5 i forrige versjon. Vi innf\u00f8rte grenser for antall foresp\u00f8rsel innen en tidsramme, antall parallelle foresp\u00f8rsel og foresp\u00f8rsel fra \u00e9n ip-adresse.<\/li>\n<\/ol>\n<p>\nSiden da har vi utgitt to mindre versjoner av API-et og lansert flere spesialiserte API-er, men generelt har tiln\u00e6rmingen forblitt uendret. Den oppdaterte utvekslingsformatet og den nye arkitekturen har gjort det mulig \u00e5 rette opp mangler i API-et mye raskere.<\/p>\n<h2>API-en til MinLager i dag<\/h2>\n<p>\nI dag l\u00f8ser API-en til MinLager mange oppgaver:<\/p>\n<ul>\n<li>datautveksling med nettbutikker, regnskapssystemer, banker;<\/li>\n<li>innhenting av beregningsdata, rapporter;<\/li>\n<li>bruk som backend for klientapplikasjoner \u2013 v\u00e5re mobile applikasjoner og stasjon\u00e6re kasser arbeider gjennom API-et.<\/li>\n<li>sending av varsler om endringer i dataene i MinLager \u2013 webhooks;<\/li>\n<li>telefoni;<\/li>\n<li>lojalitetssystemer.<\/li>\n<\/ul>\n<p>\nBasert p\u00e5 API-et skrev v\u00e5r administrerende 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 en telegram-bot som henter lagerbeholdningene via API-et: <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>N\u00e5 t\u00f8rre tall. <\/p>\n<p>Her er v\u00e5r statistikk for det gamle REST API-et:<\/p>\n<ul>\n<li>400 selskaper;<\/li>\n<li>600 brukere;<\/li>\n<li>2 millioner foresp\u00f8rsel per dag;<\/li>\n<li>200 GB\/dag utg\u00e5ende trafikk.<\/li>\n<\/ul>\n<p>\nOg her er hva vi har oppn\u00e5dd med alle API-ene til MinLager:<\/p>\n<ul>\n<li>over 70 integrasjoner (noen av dem kan sees her <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integratsii<\/a><\/noindex>);<\/li>\n<li>8500 selskaper;<\/li>\n<li>12 000 brukere;<\/li>\n<li>46 millioner foresp\u00f8rsel per dag;<\/li>\n<li>2 TB\/dag utg\u00e5ende trafikk.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hva n\u00e5<\/h2>\n<p>\nAPI-utviklingsplanene er i aktiv diskusjon. Vi pr\u00f8ver \u00e5 ta hensyn til driftsopplevelsen som brukerne gir oss. Ikke alt kan alltid gj\u00f8res med en gang, men en ny versjon av API-et med mer brukervennlige metadata og mindre komplisert struktur, OAuth for autentisering, og API for applikasjonsintegrasjoner er like rundt hj\u00f8rnet. <\/p>\n<p>Du kan f\u00f8lge med p\u00e5 nyhetene p\u00e5 en spesialside for utviklere som integrerer med MinLager: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.minklager.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.5 - 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\/no\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Skriving av API \u2014 sprakk XML (to) | ProHoster","description":"Den f\u00f8rste API-en til MinLager ble lansert for 10 \u00e5r siden. Siden den gang har vi arbeidet med eksisterende versjoner av API-en og utviklet nye. Noen versjoner av API-en har allerede blitt lagt bort.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/34354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}