{"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":"Abbiamo scritto API \u2014 abbiamo stracciato XML (due)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Il primo API di \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u00e8 apparso 10 anni fa. In tutto questo tempo abbiamo lavorato sulle versioni esistenti dell'API e ne abbiamo sviluppate di nuove. E parecchie versioni dell'API sono gi\u00e0 state sepolte. <\/p>\n<p>In questo articolo ci sar\u00e0 molto: come \u00e8 stato creato l'API, a cosa serve a un servizio cloud, cosa offre agli utenti, quali errori abbiamo commesso 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 \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430. <\/p>\n<h2>Perch\u00e9 realizzare un API per il servizio<\/h2>\n<p>\nI nostri clienti, che sono decine di migliaia di imprenditori, utilizzano attivamente soluzioni cloud: banking, negozi online, gestione delle merci, CRM. Se ci si connette a uno \u2014 \u00e8 gi\u00e0 difficile fermarsi. E ormai il quinto, ottavo, decimo servizio rende il lavoro dell'imprenditore pi\u00f9 facile, ma i dati tra questi servizi cloud vengono trasferiti manualmente dagli utenti. Il lavoro diventa un incubo.<\/p>\n<p>La soluzione ovvia \u00e8 dare agli utenti la possibilit\u00e0 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 adattati al formato di ogni servizio. Questo \u00e8 un lavoro manuale abbastanza semplice, ma con l'aumento del numero di questi servizi diventa sempre pi\u00f9 difficile.<\/p>\n<p>Quindi il passo successivo \u00e8 l'API. Con essa, il servizio cloud beneficia del collegamento di pi\u00f9 servizi in un unico punto. L'emergere di un simile ecosistema attira nuovi clienti grazie a opportunit\u00e0 aggiuntive. Un prodotto con una nuova funzionalit\u00e0 diventa pi\u00f9 vantaggioso e utile.<\/p>\n<p>Se si creano interfacce di programmazione proprie, questo attira venditori esterni sotto forma di programmatori che conoscono il tuo prodotto grazie all'API. Iniziano a costruire soluzioni basate sull'API fornito e guadagnano denaro automatizzando i compiti dei propri clienti.<\/p>\n<p>Il sistema di contabilit\u00e0 di MoegoSklada si basa su processi semplici. L'aspetto principale \u00e8 la gestione dei documenti primari, la possibilit\u00e0 di effettuare ricezioni e spedizioni di merci, e di generare report aziendali sulla base dei documenti primari. Inoltre, ci sono trasferimenti di dati, ad esempio verso contabilit\u00e0 cloud, e l'acquisizione di dati da sistemi bancari o punti vendita. Collaboriamo anche con negozi online: riceviamo informazioni sui prodotti e inviamo dati sulle giacenze.<\/p>\n<p><img decoding=\"async\" alt=\"Abbiamo scritto API \u2014 abbiamo stracciato XML (due)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Primo API di MoegoSklada<\/h2>\n<p>\nIn dieci anni di attivit\u00e0 di MoegoSklada con API, abbiamo sviluppato varie integrazioni che consentono lo scambio di dati, lavorare con le banche, effettuare pagamenti e utilizzare la telefonia esterna.<\/p>\n<p>Nel primo anno abbiamo implementato 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 noi glielo abbiamo fornito. L'esportazione veniva avviata tramite un'esportazione manuale dall'interfaccia. Quindi, non si poteva ancora definire un'API. <\/p>\n<p>In quel periodo abbiamo iniziato a collaborare con Rusagro, che gi\u00e0 utilizzava un ERP 'maturato' per la pianificazione della produzione e della vendita, mentre caricavano i vagoni negli stabilimenti tramite MoegoSklad. Cos\u00ec abbiamo avuto i primi embrioni di una vera API: lo scambio tra il nostro servizio e l'ERP avveniva tramite l'invio di un grande file di dati su tutti i tipi di documenti. <\/p>\n<p>Questa non \u00e8 una cattiva opzione per lo scambio di dati in batch, ma insieme ai documenti si dovevano trasmettere anche le loro dipendenze: informazioni sui prodotti, sui partner commerciali e sui magazzini. \u00c8 facile generare un tale 'pacco' durante l'esportazione, ma piuttosto complicato da analizzare durante l'importazione, poich\u00e9 in un pacchetto arrivano tutte le informazioni: sia sui nuovi documenti che su quelli gi\u00e0 esistenti.<\/p>\n<p>Il primo XML API ha avuto vita breve: dopo due anni abbiamo iniziato a ristrutturalo. Gi\u00e0 all'inizio del suo funzionamento abbiamo commesso alcuni errori nella costruzione dell'interfaccia programmativa.<\/p>\n<p><img decoding=\"async\" alt=\"Abbiamo scritto API \u2014 abbiamo stracciato XML (due)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Ecco come \u00e8 stato realizzato l'XML API: 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 mappatura JAXB \u00e8 stata realizzata direttamente sui bean delle entit\u00e0. Per comunicare con il database utilizziamo Hibernate, e anche su questi bean \u00e8 stata realizzata la mappatura JAXB. Questo errore si \u00e8 presentato quasi subito: qualsiasi aggiornamento della struttura dei dati portava alla necessit\u00e0 di una pronta comunicazione a tutti coloro che utilizzano l'API, oppure alla creazione di workaround che garantissero la compatibilit\u00e0 con la precedente struttura dei dati.<\/li>\n<li>L'API \u00e8 nata come una sorta di complemento, e inizialmente non abbiamo definito quale parte del prodotto costituisse. Non ci siamo nemmeno interrogati se l'API fosse qualcosa di importante, se fosse necessario mantenere la retrocompatibilit\u00e0 per i suoi primi clienti. In un certo momento, il numero degli utenti dell'API costituiva circa il 5% del numero totale piuttosto limitato, e non si prestava loro attenzione. La filtrazione universale realizzata in quel momento ha portato alla situazione in cui siamo stati utilizzati come backend. Questa filtrazione non era affatto GraphQL, ma qualcosa di simile \u2014 funzionava attraverso una miriade di parametri nella stringa della query. Con uno strumento cos\u00ec potente, gli utenti trovavano difficile astenersi, e le richieste venivano direzionate a noi in modo tale che venissero inviate direttamente dall'interfaccia utente dei loro negozi online. La situazione \u00e8 diventata una brutta sorpresa, poich\u00e9 fornire un servizio del genere dovrebbe richiedere una diversa tariffazione e, in generale, un'altra comprensione dell'API come prodotto.<\/li>\n<li>Poich\u00e9 l'API si \u00e8 sviluppata non come prodotto principale, la documentazione riguardante l'API \u00e8 stata prodotta e pubblicata per scarti \u2014 attraverso ingegneria inversa. Questo approccio sembra piuttosto semplice e conveniente, ma contrasta con il lavoro basato su contratti. Questo \u00e8 quando esiste un qualche componente con uno schema di funzionamento predefinito. Lo sviluppatore lo realizza in conformit\u00e0 a questo schema e obiettivo, il componente viene testato, e il cliente riceve un prodotto che corrisponde all'idea dell'analista. L'ingegneria inversa, invece, immette sul mercato un prodotto che semplicemente esiste: con workaround, soluzioni stravaganti e biciclette al posto della funzionalit\u00e0 necessaria. <\/li>\n<li>Tutto il flusso di richieste che arrivava tramite l'API poteva essere analizzato al massimo come i log di Nginx o del server applicativo. Questo non permetteva di isolare le aree tematiche, a meno che non si suddividesse per utenti e abbonati. Se non c'\u00e8 possibilit\u00e0 di regolare la registrazione dell'app o dei clienti, analizzare la situazione diventa impossibile. Questo problema ha avuto il minore impatto sullo sviluppo dell'API, riguarda pi\u00f9 la comprensione della sua domanda e della sua 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 scambio con la contabilit\u00e0 online \u2014 BuchSoft. Non ha funzionato. Ma nel processo di integrazione \u00e8 emersa una vera e propria API: un servizio REST di scambio, in cui mancavano libert\u00e0 come le chiamate RPC per le operazioni. Tutta la comunicazione con l'API \u00e8 stata ridotta a uno standard per REST: nella stringa della richiesta si trovava il nome dell'entit\u00e0, mentre l'operazione da eseguire su di essa veniva specificata tramite il metodo http. Abbiamo aggiunto la filtrazione in base al momento di aggiornamento delle entit\u00e0, e gli utenti hanno potuto costruire repliche con i propri sistemi.<\/p>\n<p>Nello stesso anno \u00e8 stata introdotta l'API per l'estrazione delle giacenze di magazzino 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 sul costo dei prodotti.<\/p>\n<p>Nel dicembre 2015 RetailCRM ha pubblicato la prima libreria di terze parti per accedere alla nostra API. \u00c8 stata utilizzata piuttosto attivamente, con una crescente popolarit\u00e0 del servizio nel suo insieme, e il carico sull'API cresceva pi\u00f9 velocemente rispetto a quello sull'interfaccia web. A un certo punto, la crescita si \u00e8 trasformata in un salto del carico. <\/p>\n<p><img decoding=\"async\" alt=\"Abbiamo scritto API \u2014 abbiamo stracciato XML (due)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Abbiamo scritto API \u2014 abbiamo stracciato XML (due)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE quel salto, indicato dalla freccia a sinistra, ha completamente stupito il server che gestiva la nostra API. Abbiamo passato una settimana a capire cosa generasse esattamente quel carico. Si \u00e8 scoperto che si trattava proprio di quelle richieste trasmesse alla nostra API dai front-end dei clienti. Sono state circa 50 i clienti a generare tutto ci\u00f2. In quel momento, abbiamo compreso uno dei nostri errori: la completa mancanza di limiti. <\/p>\n<p>Alla fine abbiamo introdotto un limite al numero di richieste simultanee. Con un singolo account, \u00e8 possibile aprire non pi\u00f9 di due richieste contemporaneamente. Questo \u00e8 sufficiente per lavorare in modalit\u00e0 replica per lo scambio di dati in modalit\u00e0 batch. Coloro che volevano utilizzare il nostro servizio come backend, da questo momento in poi, sono stati costretti a rispettare di pi\u00f9 le tariffe, poich\u00e9 hanno integrato nei loro strumenti software il lavoro con 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 maggiore volume di dati nello scambio di informazioni con i clienti. Nel 2015 abbiamo lanciato un progetto per mettere in ordine l'API. Abbiamo scelto il formato JSON invece di XML e abbiamo iniziato a costruirlo sulla base delle peculiarit\u00e0 emerse nell'implementazione della versione precedente:<\/p>\n<ol>\n<li>Possibilit\u00e0 di gestire le versioni. La versioning 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 metadata nella risposta stessa che riceve.<\/li>\n<li>Possibilit\u00e0 di scambiare grandi documenti. Se trattiamo un documento con un numero di articoli maggiore di 4-5 mila, questo diventa un problema per il server: transazione lunga, richiesta http lunga. Abbiamo costruito un meccanismo speciale che consente di aggiornare il documento a pezzi e gestire singoli articoli di quel documento, inviandoli al server.<\/li>\n<li>Strumenti per la replica - c'erano anche nella versione precedente.<\/li>\n<li>Limiti di carico - come eredit\u00e0 delle difficolt\u00e0 riscontrate nella versione precedente. Abbiamo introdotto limiti al numero di richieste in un intervallo di tempo, al numero di richieste parallele e alle richieste da un singolo indirizzo ip.<\/li>\n<\/ol>\n<p>\nDa quel momento abbiamo rilasciato due versioni minori dell'API e abbiamo avviato diversi API specializzati, ma nel complesso l'approccio \u00e8 rimasto invariato. Il formato di scambio aggiornato e la nuova architettura hanno permesso di risolvere i difetti dell'API molto pi\u00f9 rapidamente.<\/p>\n<h2>API del Mio Magazzino oggi<\/h2>\n<p>\nOggi l'API del Mio Magazzino risolve molteplici compiti:<\/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 - le nostre applicazioni mobili e il punto cassa desktop funzionano tramite API.<\/li>\n<li>invio di notifiche sulle modifiche dei dati in MieiMagazzini \u2014 webhooks;<\/li>\n<li>telefonia;<\/li>\n<li>sistemi di fidelizzazione.<\/li>\n<\/ul>\n<p>\nBasato su API, il nostro amministratore delegato Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> in quattro ore ha scritto un bot Telegram che recupera tramite API i rimanenti: <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 solo numeri freddi. <\/p>\n<p>Ecco le nostre statistiche sul 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 dove siamo arrivati con tutte le API di MieiMagazzini:<\/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>E ora?<\/h2>\n<p>\nI piani per lo sviluppo dell'API sono attualmente in attiva discussione. Cerchiamo di tenere conto dell'esperienza d'uso fornita dagli utenti. Non sempre e non tutto pu\u00f2 essere fatto subito, ma la nuova versione dell'API con metadati pi\u00f9 comodi e una struttura meno complessa, OAuth per l'autenticazione e API per app integrate nell'interfaccia \u00e8 dietro l'angolo. <\/p>\n<p>Per seguire le notizie, \u00e8 possibile visitare il sito dedicato per gli sviluppatori di integrazioni con MieiMagazzini: <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 5.0.1.1 - 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\/it\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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.\" \/>\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 API \u2014 abbiamo strappato XML (due) | ProHoster","description":"Il primo API di \u041c\u043e\u0435\u0433\u043e\u0421\u043a\u043b\u0430\u0434\u0430 \u00e8 apparso 10 anni fa. In tutto questo tempo abbiamo lavorato sulle versioni esistenti dell'API e ne abbiamo sviluppate di nuove. E parecchie versioni dell'API sono gi\u00e0 state sepolte.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}