{"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\/it\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"API scritti \u2014 XML strappato (due)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Il primo API di Mo\u0451goSklada \u00e8 apparso 10 anni fa. Da allora lavoriamo sulle versioni esistenti dell'API e sviluppiamo nuove versioni. E alcune versioni dell'API sono gi\u00e0 state obsolete. <\/p>\n<p>In questo articolo troverai molte informazioni: come \u00e8 stato creato l'API, a cosa serve per i servizi cloud, cosa offre agli utenti, quali ostacoli abbiamo incontrato e cosa vogliamo fare in futuro. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMi chiamo Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, sono il direttore tecnico e cofondatore di Mo\u0451goSklada. <\/p>\n<h2>Perch\u00e9 fare un'API per il servizio<\/h2>\n<p>\nI nostri clienti, che sono decine di migliaia di imprenditori, utilizzano attivamente soluzioni cloud: banche online, negozi internet, gestione delle merci, CRM. Una volta collegati a uno, \u00e8 difficile fermarsi. E ora il quinto, l'ottavo, il decimo servizio rende il lavoro degli imprenditori pi\u00f9 facile, ma i dati tra questi servizi cloud devono essere trasferiti manualmente dagli utenti. Il lavoro si trasforma in un incubo.<\/p>\n<p>Una soluzione ovvia \u00e8 quella di consentire agli utenti di trasferire dati tra servizi cloud. Ad esempio, importare ed esportare dati come file che possono poi essere caricati nel servizio desiderato. I file di solito vengono modificati nel formato richiesto da ciascun servizio. Questo \u00e8 un lavoro manuale pi\u00f9 o meno semplice, ma con l'aumento di questi servizi, diventa sempre pi\u00f9 difficile da gestire.<\/p>\n<p>Pertanto, il passo successivo \u00e8 l'API. Con essa, il servizio cloud beneficia del collegamento di pi\u00f9 servizi in un unico punto. La creazione di un ecosistema del genere attira nuovi clienti grazie alle opportunit\u00e0 aggiuntive. Un prodotto con nuove funzionalit\u00e0 diventa pi\u00f9 vantaggioso e utile.<\/p>\n<p>Se si creano interfacce di programmazione proprie, si attirano venditori esterni sotto forma di programmatori che conoscono il proprio prodotto grazie all'API. Iniziano a sviluppare soluzioni basate sull'API proposta e guadagnano denaro automatizzando i compiti dei loro clienti.<\/p>\n<p>Il sistema di contabilit\u00e0 di MoegoSklanda si basa su processi semplici. L'obiettivo principale \u00e8 lavorare con documenti primari, consentire la ricezione e la spedizione di merci e fornire report aziendali basati sui documenti primari. \u00c8 anche possibile trasferire dati, ad esempio verso software di contabilit\u00e0 cloud, e riceverli da sistemi bancari o punti vendita. Inoltre, collaboriamo con negozi online: otteniamo informazioni sui prodotti e inviamo dati sulle giacenze.<\/p>\n<p><img decoding=\"async\" alt=\"API scritti \u2014 XML strappato (due)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Il primo API di MoegoSklanda<\/h2>\n<p>\nNegli ultimi 10 anni di attivit\u00e0 di MoegoSklanda con API, abbiamo accumulato una variet\u00e0 di integrazioni che consentono lo scambio di dati, l'interazione con le banche, l'effettuazione di pagamenti e l'uso di telefonia esterna.<\/p>\n<p>Nel primo anno abbiamo creato la possibilit\u00e0 di esportare qualsiasi dato in formato XML. All'epoca, per gli utenti era molto pi\u00f9 chiaro e consueto mantenere i dati offline piuttosto che in qualche cloud, e abbiamo fornito loro questa opzione. L'esportazione veniva avviata tramite un'esportazione manuale dall'interfaccia. Quindi non si poteva nemmeno parlare di API. <\/p>\n<p>Allora abbiamo iniziato a collaborare con l'azienda Rusagro: avevano gi\u00e0 utilizzato un ERP 'mature' per la pianificazione della produzione e delle vendite, mentre il caricamento dei vagoni negli stabilimenti \u00e8 stato automatizzato in \u041c\u043e\u0435\u043c\u0421\u043a\u043b\u0430\u0434\u0435. Cos\u00ec sono emerse le prime basi di una vera API: lo scambio tra il nostro servizio e l'ERP avveniva tramite l'invio di un grande file con i dati su tutti i tipi di documenti. <\/p>\n<p>Questa \u00e8 una buona opzione per lo scambio di dati in batch, ma insieme ai documenti era necessario trasmettere anche le loro dipendenze: informazioni sui prodotti, sui partner commerciali e sui magazzini. Generare un simile ammasso durante l'esportazione non \u00e8 cos\u00ec difficile, ma \u00e8 piuttosto complicato da analizzare durante l'importazione, poich\u00e9 in un unico pacchetto arrivano tutte le informazioni: sia sui nuovi documenti che su quelli gi\u00e0 esistenti.<\/p>\n<p>Il primo XML API non \u00e8 durato a lungo: dopo due anni abbiamo iniziato la sua ristrutturazione. Anche all'inizio del suo funzionamento abbiamo commesso alcuni errori nella costruzione dell'interfaccia programmativa.<\/p>\n<p><img decoding=\"async\" alt=\"API scritti \u2014 XML strappato (due)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Come \u00e8 stato realizzato l'XML API: un'illustrazione di uno dei nostri architetti. A proposito, aspettatevi i suoi articoli.<\/i><\/p>\n<p>Ecco i nostri principali errori:<\/p>\n<ol>\n<li>La serializzazione JAXB \u00e8 stata eseguita direttamente sui bean delle entit\u00e0. Per comunicare con il database utilizziamo Hibernate, e la stessa serializzazione JAXB \u00e8 stata applicata a questi bean. Questo errore \u00e8 emerso quasi immediatamente: qualsiasi aggiornamento della struttura dei dati richiedeva di avvisare urgentemente tutti coloro che utilizzavano l'API, oppure di costruire delle soluzioni temporanee che garantissero la compatibilit\u00e0 con la precedente struttura dei dati.<\/li>\n<li>L'API \u00e8 cresciuto come un'aggiunta, e inizialmente non abbiamo definito quale parte del prodotto costituisse. Non ci siamo chiesti se l'API fosse qualcosa di importante, se fosse necessario mantenere la retrocompatibilit\u00e0 per i suoi primi clienti. A un certo punto, il numero degli utenti dell'API rappresentava circa il 5% del totale, e non si prestava loro attenzione. La filtrazione universale realizzata all'epoca ha portato a usarci come backend. Questa filtrazione non era del tutto GraphQL, ma qualcosa di simile \u2014 funzionava tramite un mucchio di parametri nella stringa della query. Con uno strumento cos\u00ec potente, gli utenti hanno trovato difficile resistere, e le richieste sono state indirizzate a noi in modo che fossero inviate direttamente dall'interfaccia utente dei loro negozi online. La situazione si \u00e8 rivelata una spiacevole sorpresa, poich\u00e9 fornire tale servizio richiederebbe una diversa tariffazione e, in generale, una diversa comprensione dell'API come prodotto.<\/li>\n<li>Poich\u00e9 l'API \u00e8 stato sviluppato come un prodotto secondario, la documentazione dell'API \u00e8 stata realizzata e pubblicata come un ripiego \u2014 attraverso il reverse engineering. Questo approccio pu\u00f2 sembrare semplice e comodo, ma contraddice le normative contrattuali. Si tratta di avere un componente con uno schema di lavoro predeterminato. Lo sviluppatore lo implementa secondo questo schema e l'obiettivo, il componente viene testato, e il cliente riceve un prodotto conforme alle intenzioni dell'analista. Il reverse engineering, invece, immette sul mercato un prodotto che esiste semplicemente: con soluzione temporanee, approcci bizzarri e un'invenzione di ruote al posto della funzionalit\u00e0 necessaria. <\/li>\n<li>L'intero flusso di richieste che arrivava tramite API poteva essere analizzato al massimo come un log di Nginx o di un server applicativo. Questo non permetteva di identificare le aree tematiche, a meno di suddividerle per utenti e abbonati. Senza la possibilit\u00e0 di regolare la registrazione delle applicazioni o dei clienti, diventa impossibile analizzare la situazione. Questo problema ha avuto un impatto minimo sullo sviluppo dell'API, si tratta pi\u00f9 di comprendere la sua domanda e la completezza delle funzionalit\u00e0.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Tentativo numero due: REST API<\/h2>\n<p>\nNel 2010 abbiamo cercato di costruire un sistema di integrazione con un software di contabilit\u00e0 online \u2014 BuchSoft. Non ha avuto successo. Tuttavia, durante il processo di integrazione \u00e8 emerso un API completo: un servizio REST di scambio, dove non c'erano libert\u00e0 come le chiamate RPC per le operazioni. Tutta la comunicazione con l'API \u00e8 stata standardizzata secondo il formato REST: nella stringa di richiesta \u00e8 contenuto il nome dell'entit\u00e0, e l'operazione da eseguire \u00e8 specificata tramite il metodo HTTP. Abbiamo aggiunto la possibilit\u00e0 di filtrare in base al momento di aggiornamento delle entit\u00e0, dando agli utenti la possibilit\u00e0 di costruire la replicazione con i propri sistemi.<\/p>\n<p>Nello stesso anno \u00e8 stato introdotto l'API per l'esportazione delle giacenze e dei prodotti. Attraverso l'API sono diventate disponibili per gli utenti le parti pi\u00f9 preziose del sistema: lo scambio di documenti primari e i dati di calcolo sulle giacenze e sui costi dei prodotti.<\/p>\n<p>Nel dicembre 2015, RetailCRM ha pubblicato la prima libreria di terze parti per accedere al nostro API. \u00c8 stata utilizzata piuttosto attivamente, mentre la popolarit\u00e0 del servizio in generale cresceva, e il carico sull'API aumentava pi\u00f9 rapidamente di quello sull'interfaccia web. Un giorno, la crescita si \u00e8 trasformata in un'impennata del carico. <\/p>\n<p><img decoding=\"async\" alt=\"API scritti \u2014 XML strappato (due)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"API scritti \u2014 XML strappato (due)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE questa impennata, indicata dalla freccia a sinistra, ha lasciato completamente sbalordito il server che gestisce il nostro API. Abbiamo trascorso una settimana a capire cosa stava generando quel carico. Si \u00e8 scoperto che erano proprio quelle richieste trasmesse al nostro API dai fronti dei clienti. Circa 50 clienti hanno assorbito tutto. In quel momento abbiamo capito uno dei nostri errori: la totale assenza di limiti. <\/p>\n<p>Alla fine abbiamo introdotto un limite al numero di richieste simultanee. Da un singolo account ora \u00e8 possibile aprire al massimo due richieste contemporaneamente. Questo \u00e8 sufficiente per lavorare in modalit\u00e0 replica per lo scambio di dati in modalit\u00e0 batch. Coloro che desideravano utilizzare i nostri servizi come backend erano costretti a seguire maggiormente le tariffe, poich\u00e9 hanno dovuto implementare nel proprio software la gestione di pi\u00f9 account.<\/p>\n<h2>Mettiamo in ordine<\/h2>\n<p>\nGi\u00e0 dal 2014, la domanda per l'API esistente \u00e8 diventata una parte importante del business, e l'API stessa generava il pi\u00f9 grande volume di dati nello scambio informatico con i clienti. Nel 2015 abbiamo avviato un progetto per mettere a posto l'API. Abbiamo scelto il formato JSON invece di XML e abbiamo iniziato a costruirlo sulla base delle caratteristiche emerse dalla realizzazione della versione precedente:<\/p>\n<ol>\n<li>Possibilit\u00e0 di gestire le versioni. La gestione delle versioni consente di sviluppare una nuova versione senza influenzare l'applicazione esistente e senza interrompere il lavoro degli utenti. <\/li>\n<li>Possibilit\u00e0 per l'utente di vedere i metadati nella risposta che riceve.<\/li>\n<li>La possibilit\u00e0 di scambiare grandi documenti. Quando elaboriamo un documento con pi\u00f9 di 4-5 mila voci, questo diventa un problema per il server: transazione lunga, richiesta HTTP lunga. Abbiamo costruito un meccanismo speciale che consente di aggiornare il documento in parti e gestire singole voci di quel documento, inviandole al server.<\/li>\n<li>Strumenti per la replicazione - presenti anche nella versione precedente.<\/li>\n<li>Limiti di carico - come un'eredit\u00e0 degli errori commessi nella versione precedente. Abbiamo introdotto limiti sul numero di richieste in un dato intervallo di tempo, sul numero di richieste parallele e sulle richieste da un singolo indirizzo IP.<\/li>\n<\/ol>\n<p>\nDa quel momento abbiamo rilasciato due versioni minori dell'API e lanciato diverse API specializzate, ma in generale l'approccio \u00e8 rimasto invariato. Il nuovo formato di scambio e la nuova architettura hanno permesso di risolvere i difetti nell'API molto pi\u00f9 rapidamente.<\/p>\n<h2>API di MoioScald oggi<\/h2>\n<p>\nOggi API di MoioScald risolve molte attivit\u00e0:<\/p>\n<ul>\n<li>scambio di dati con negozi online, sistemi contabili, banche;<\/li>\n<li>ottenimento di dati di calcolo, report;<\/li>\n<li>utilizzo come backend per applicazioni client \u2014 le nostre app mobili e il punto cassa desktop funzionano tramite API<\/li>\n<li>invio di notifiche sulle modifiche dei dati in Mo\u00efsklad \u2014 webhooks;<\/li>\n<li>telefoni;<\/li>\n<li>sistemi di fidelizzazione.<\/li>\n<\/ul>\n<p>\nBasato sull'API, il nostro CEO Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> ha scritto un bot Telegram in quattro ore, che recupera tramite API i dati di magazzino: <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>Ora i numeri nudi. <\/p>\n<p>Ecco le nostre statistiche per il vecchio REST API:<\/p>\n<ul>\n<li>400 aziende;<\/li>\n<li>600 utenti;<\/li>\n<li>2 milioni di richieste al giorno;<\/li>\n<li>200 GB\/giorno di traffico in uscita.<\/li>\n<\/ul>\n<p>\nEcco a cosa siamo arrivati con tutte le API di Mo\u00efsklad:<\/p>\n<ul>\n<li>oltre 70 integrazioni (alcune delle quali possono essere visualizzate qui <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integratsii<\/a><\/noindex>);<\/li>\n<li>8500 aziende;<\/li>\n<li>12.000 utenti;<\/li>\n<li>46 milioni di richieste al giorno;<\/li>\n<li>2 TB\/giorno di traffico in uscita.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Cosa succede dopo<\/h2>\n<p>\nI piani per lo sviluppo delle API sono attivamente in discussione. Cerchiamo di tenere conto delle esperienze operative fornite dagli utenti. Non sempre riusciamo a fare tutto subito, ma non \u00e8 lontana una nuova versione dell'API con metadati pi\u00f9 comodi e una struttura meno complessa, OAuth per l'autenticazione e API per l'integrazione nelle applicazioni. <\/p>\n<p>Puoi seguire le ultime novit\u00e0 sul sito speciale per sviluppatori sulle integrazioni con MoimSklad: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.moysklad.ru<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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 4.9.10 - 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. \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\" \/>\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\/it\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Abbiamo scritto l'API e abbiamo distrutto XML (due) | ProHoster","description":"Il primo API di MoimSklad \u00e8 apparso 10 anni fa. Da allora lavoriamo sulle versioni esistenti dell'API e ne sviluppiamo di nuove. Alcune versioni dell'API sono gi\u00e0 state abbandonate. In questo articolo ci sar\u00e0 molto da dire: come \u00e8 stata creata l'API, a cosa serve per il servizio cloud, cosa offre agli utenti, quali errori abbiamo gi\u00e0 commesso e cosa intendiamo fare in futuro. Io","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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. \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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}