{"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\/nl\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"We schreven API \u2014 we doorbraken XML (twee)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>De eerste API van MijnVoorraad verscheen 10 jaar geleden. Gedurende deze tijd hebben we gewerkt aan de bestaande versies van de API en ontwikkelen we nieuwe. Al enkele versies van de API zijn inmiddels begraven. <\/p>\n<p>In dit artikel komt er veel voorbij: hoe we de API hebben gemaakt, waarom deze nodig is voor de cloudservice, wat gebruikers ervan hebben, op welke hobbels we zijn gestuit en wat we verder willen doen. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMijn naam is Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, ik ben technisch directeur en medeoprichter van MijnVoorraad. <\/p>\n<h2>Waarom een API maken voor de service<\/h2>\n<p>\nOnze klanten, wat tientallen duizenden ondernemers zijn, maken actief gebruik van cloudoplossingen: bankieren, webwinkels, voorraadbeheer, CRM. Eenmaal aangesloten op \u00e9\u00e9n service is het al moeilijk om te stoppen. En dan is er al de vijfde, achtste, tiende service die het werk van de ondernemer vergemakkelijkt, maar gebruikers verplaatsen de gegevens tussen deze cloudservices handmatig. Het werk verandert in een nachtmerrie.<\/p>\n<p>De voor de hand liggende oplossing is om gebruikers de mogelijkheid te geven om gegevens tussen cloudservices uit te wisselen. Bijvoorbeeld, gegevens importeren en exporteren als bestanden die vervolgens in de gewenste service kunnen worden ge\u00fcpload. De bestanden worden meestal aangepast aan het formaat van elke service. Dit is meer of minder eenvoudig handwerk, maar naarmate het aantal van deze services toeneemt, wordt het steeds moeilijker om dit uit te voeren.<\/p>\n<p>Daarom is de volgende stap de API. Hiermee wint de cloudservice door meerdere services op \u00e9\u00e9n plek te verbinden. De komst van zo'n ecosysteem trekt nieuwe klanten aan door extra mogelijkheden. Een product met nieuwe functionaliteiten wordt voordeliger en nuttiger.<\/p>\n<p>Als je eigen programmatic interfaces cre\u00ebert, trekt dat externe verkopers aan in de vorm van programmeurs die over jouw product leren dankzij de API. Zij beginnen oplossingen te bouwen op basis van de aangeboden API en verdienen geld met het automatiseren van de taken van hun klanten.<\/p>\n<p>Het boekhoudsysteem van MijnVoorraad is gebaseerd op eenvoudige processen. Het belangrijkste is het werken met primaire documenten, de mogelijkheid om goederen te ontvangen en af te leveren, en op basis van de basisdocumenten rapporten voor het bedrijfsleven te verkrijgen. Ook is er de overdracht van gegevens, bijvoorbeeld naar cloudboekhouding, en het verkrijgen ervan uit banksystemen of retailpunten. Daarnaast werken we samen met webwinkels: we ontvangen informatie over producten en sturen gegevens over voorraadniveaus.<\/p>\n<p><img decoding=\"async\" alt=\"We schreven API \u2014 we doorbraken XML (twee)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>De eerste API van MijnMagazin<\/h2>\n<p>\nIn de 10 jaar dat MijnMagazin met API werkt, hebben we verschillende integraties ontwikkeld die het mogelijk maken om gegevens uit te wisselen, met banken te werken, betalingen uit te voeren en externe telefonie te gebruiken.<\/p>\n<p>In het eerste jaar hebben we de mogelijkheid gemaakt om gegevens in XML-indeling te exporteren. Toen was het voor gebruikers veel duidelijker en gebruikelijker om gegevens offline te bewaren, in plaats van in een of andere cloud, en dat hebben we hen gegeven. De export werd handmatig gestart vanuit de interface. Dus zo kon je het nog niet echt een API noemen. <\/p>\n<p>Toen zijn we gaan samenwerken met het bedrijf Rusagro \u2014 zij gebruikten al een 'volwassen' ERP-systeem voor productieplanning en verkoop, maar de belading van wagons bij de fabrieken werd geautomatiseerd in MijnMagazin. Zo kregen we de eerste aanzetten van een echte API: de uitwisseling tussen onze service en ERP vond plaats door het verzenden van een groot bestand met gegevens over alle documenten. <\/p>\n<p>Dit was een goede optie voor batchgegevensuitwisseling, maar samen met documenten moesten ook de afhankelijkheden worden doorgegeven: informatie over producten, partners en magazijnen. Zo'n rommel is niet moeilijk te genereren bij export, maar behoorlijk moeilijk te verwerken bij import, aangezien in \u00e9\u00e9n pakket alle gegevens binnenkomen: zowel over nieuwe documenten, als over al bestaande.<\/p>\n<p>De eerste XML API heeft niet lang bestaan \u2014 na twee jaar zijn we begonnen met de herstructurering ervan. Al aan het begin van de werking hebben we een aantal fouten gemaakt bij het bouwen van de programmeerinterface.<\/p>\n<p><img decoding=\"async\" alt=\"We schreven API \u2014 we doorbraken XML (twee)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Hoe de XML API werd gemaakt: een illustratie van een van onze architecten. Overigens, verwacht ook zijn artikelen.<\/i><\/p>\n<p>Dit zijn onze belangrijkste fouten:<\/p>\n<ol>\n<li>De JAXB-markering was direct op de entity beans gedaan. Voor communicatie met de database gebruiken we Hibernate, en op deze binen is de JAXB-markering gedaan. Deze fout kwam bijna onmiddellijk aan het licht: elke wijziging in de datastructuur leidde tot de noodzaak om urgent alle gebruikers van de API te informeren, of het bouwen van noodoplossingen die compatibiliteit met de vorige datastructuur waarborgden.<\/li>\n<li>De API ontwikkelde zich als een aanvulling en aanvankelijk bepaalden we niet welk deel van het product het vormde. We dachten ook niet na over de vraag of de API iets belangrijks was en of we terugwaartse compatibiliteit voor de eerste klanten moesten ondersteunen. Een tijdje maakte ongeveer 5% van het totale, kleine aantal gebruikers gebruik van de API, en we gaven er weinig aandacht aan. De eerder ge\u00efmplementeerde universele filtering leidde ertoe dat we als backend werden gebruikt. Deze filtering was helemaal geen GraphQL, maar iets dat daarop leek \u2014 het werkte met tal van parameters in de querystring. Met zo'n krachtig instrument was het voor gebruikers moeilijk om zich te onthouden, en aanvragen werden direct via de UI van hun webshops naar ons verzonden. De situatie werd een onaangename verrassing, omdat het aanbieden van zo'n dienst een andere prijsstelling en een heel andere benadering van de API als product zou moeten vereisen.<\/li>\n<li>Omdat de API zich niet als een hoofdproduct ontwikkelde, werd de documentatie voor de API op een restbasis gemaakt en gepubliceerd \u2014 via reverse engineering. Deze aanpak lijkt vrij eenvoudig en handig, maar is in strijd met de contractuele vereisten. Dit is wanneer er een component is met een vooraf vastgestelde werkstructuur. De ontwikkelaar implementeert deze structuur en taak, de component wordt getest, en de klant ontvangt een product dat overeenkomt met de visie van de analist. Reverse engineering daarentegen gooit een product op de markt dat er gewoon is: met tijdelijke oplossingen, vreemde beslissingen en fietsen in plaats van de benodigde functionaliteit. <\/li>\n<li>De volledige stroom aanvragen die via de API binnenkwamen, kon niet verder worden geanalyseerd dan de log van de Nginx of de applicatieserver. Dit maakte het onmogelijk om onderwerpen te onderscheiden, behalve om deze op gebruikers en abonnees te splitsen. Als er geen mogelijkheid is om de registratie van applicaties of cli\u00ebnten te regelen, wordt het onmogelijk om de situatie te analyseren. Dit probleem heeft in de minste mate invloed gehad op de ontwikkeling van de API; het gaat meer om het begrijpen van de vraag ernaar en de functionaliteit die deze biedt.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Poging nummer twee: REST API<\/h2>\n<p>\nIn 2010, we attempted to build a system for exchanging data with an online accounting service \u2014 BukhSoft. It didn\u2019t take off. However, during the integration process, we developed a full-featured API: a REST exchange service, devoid of liberties like RPC calls for operations. All communication with the API was standardized to the REST mode: the request string contains the name of the entity, while the operation performed on it is defined by the HTTP method. We added filtering based on the moment of updating entities, giving users the ability to build replication with their systems.<\/p>\n<p>That same year, we introduced an API for exporting warehouse and product balances. Through the API, the most valuable parts of the system became accessible to users \u2014 the exchange of primary documents and the calculation data for balances and product costs.<\/p>\n<p>In December 2015, RetailCRM published the first third-party library for accessing our API. It became quite popular, leading to an increase in the popularity of the service overall, with the load on the API growing faster than that on the web interface. At one point, growth turned into a spike in load. <\/p>\n<p><img decoding=\"async\" alt=\"We schreven API \u2014 we doorbraken XML (twee)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"We schreven API \u2014 we doorbraken XML (twee)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnd this spike, indicated by the arrow on the left, completely astonished the server servicing our API. We spent a week figuring out what exactly was generating this load. It turned out to be those very requests being relayed to our API from clients' fronts. About 50 clients accounted for the entire load. At that moment, we realized one of our mistakes \u2014 the total lack of limits. <\/p>\n<p>As a result, we implemented a limit on the number of simultaneous requests. From one account, it became possible to open no more than two requests at the same time. This is sufficient for operating in replication mode for data exchange in batch mode. Those who wanted to use us as a backend had to comply more with the tariffs, as they had to implement work with multiple accounts in their software.<\/p>\n<h2>We are organizing<\/h2>\n<p>\nSince 2014, the demand for the existing API became an important part of the business, and the API itself generated the largest volume of data in data exchanges with clients. In 2015, we launched a project to bring the API in order. We chose JSON as the format instead of XML and began to build it based on the features that emerged during the implementation of the previous version:<\/p>\n<ol>\n<li>Mogelijkheid om versies te beheren. Versiebeheer stelt ons in staat om een nieuwe versie te ontwikkelen zonder de bestaande applicatie te be\u00efnvloeden en de werking voor gebruikers te verstoren. <\/li>\n<li>Mogelijkheid voor gebruikers om metadata in het antwoord te zien dat zij ontvangen.<\/li>\n<li>Mogelijkheid om grote documenten uit te wisselen. Wanneer we een document met meer dan 4-5 duizend items verwerken, wordt het een probleem voor de server: lange transactie, lange http-aanroep. We hebben een speciaal mechanisme ontwikkeld om documenten in delen bij te werken en afzonderlijke items van dat document te beheren door ze naar de server te sturen.<\/li>\n<li>Tools voor replicatie \u2014 waren er ook in de vorige versie.<\/li>\n<li>Belastinglimieten \u2014 als gevolg van fouten die zijn gemaakt in de vorige versie. We hebben limieten ingesteld voor het aantal verzoeken in een bepaalde tijd, het aantal gelijktijdige verzoeken en verzoeken vanuit \u00e9\u00e9n ip-adres.<\/li>\n<\/ol>\n<p>\nSindsdien hebben we twee minor API-versies uitgebracht en verschillende gespecialiseerde API's gelanceerd, maar de aanpak is grotendeels hetzelfde gebleven. Het vernieuwde uitwisselingsformaat en de nieuwe architectuur hebben het mogelijk gemaakt om tekortkomingen in de API veel sneller te verhelpen.<\/p>\n<h2>API van MijnVoorraad vandaag<\/h2>\n<p>\nVandaag de dag lost de API van MijnVoorraad veel taken op:<\/p>\n<ul>\n<li>gegevensuitwisseling met webwinkels, boekhoudsystemen, banken;<\/li>\n<li>verkrijgen van rekendata, rapporten;<\/li>\n<li>gebruiken als backend voor cli\u00ebntapplicaties \u2014 onze mobiele apps en desktopkassa werken via de API<\/li>\n<li>verzending van meldingen over gegevenswijzigingen in MijnVoorraad \u2014 webhooks;<\/li>\n<li>telefonie;<\/li>\n<li>loyaliteitsystemen.<\/li>\n<\/ul>\n<p>\nOp basis van de API heeft onze CEO Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> in vier uur een Telegram-bot geschreven die via de API voorraden ophaalt: <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 de cijfers. <\/p>\n<p>Hier zijn onze statistieken van de oude REST API:<\/p>\n<ul>\n<li>400 bedrijven;<\/li>\n<li>600 gebruikers;<\/li>\n<li>2 miljoen verzoeken per dag;<\/li>\n<li>200 GB\/dag aan uitgaand verkeer.<\/li>\n<\/ul>\n<p>\nEn dit is wat we hebben bereikt met alle API's van MijnVoorraad:<\/p>\n<ul>\n<li>meer dan 70 integraties (een deel hiervan is hier te zien <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.nl\/integraties<\/a><\/noindex>);<\/li>\n<li>8500 bedrijven;<\/li>\n<li>12.000 gebruikers;<\/li>\n<li>46 miljoen verzoeken per dag;<\/li>\n<li>2 TB\/dag aan uitgaand verkeer.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:<\/h2>\n<p>\nDe plannen voor de ontwikkeling van de API zijn momenteel onderwerp van actieve discussie. We proberen rekening te houden met de operationele ervaringen die onze gebruikers delen. Niet altijd lukt het om alles meteen te realiseren, maar de nieuwe versie van de API met gebruiksvriendelijkere metadata en een minder complexe structuur, en OAuth voor authenticatie, staat voor de deur, evenals een API voor ingebedde applicatie-interfaces. <\/p>\n<p>Blijf op de hoogte van het nieuws op de speciale website voor ontwikkelaars van integraties met MijnMagazijn: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.mijnmagazijn.nl<\/a><\/noindex>.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47We schreven de API \u2014 we verbrandden XML (twee) | ProHoster","description":"De eerste API van MijnVoorraad verscheen 10 jaar geleden. Gedurende deze tijd hebben we gewerkt aan de bestaande versies van de API en ontwikkelen we nieuwe. Al enkele versies van de API zijn inmiddels begraven.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/34354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}