{"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\/ro\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"Am scris API \u2014 am rupt XML (dou\u0103)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Primul API al MeuStoc a ap\u0103rut acum 10 ani. \u00cen tot acest timp, am lucrat la versiunile existente ale API-ului \u0219i dezvolt\u0103m altele noi. Iar c\u00e2teva versiuni ale API-ului au fost deja \u201e\u00eengropate\u201d. <\/p>\n<p>\u00cen acest articol vor fi multe informa\u021bii: cum a fost creat API-ul, de ce este necesar pentru serviciile cloud, ce le ofer\u0103 utilizatorilor, pe ce obstacole am dat peste \u0219i ce dorim s\u0103 facem \u00een continuare. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nM\u0103 numesc Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, sunt director tehnic \u0219i co-fondator al MeuStoc. <\/p>\n<h2>De ce s\u0103 facem un API pentru serviciu<\/h2>\n<p>\nClien\u021bii no\u0219tri, care sunt zeci de mii de antreprenori, folosesc activ solu\u021bii cloud: servicii bancare, magazine online, gestiune a stocurilor, CRM. Te conectezi la unul \u2014 \u0219i deja devine greu s\u0103 te opre\u0219ti. Iar acum al cincilea, al optulea, al zecelea serviciu face munca antreprenorilor mai u\u0219oar\u0103, dar utilizatorii transfer\u0103 manual datele \u00eentre aceste servicii cloud. Munca devine un co\u0219mar.<\/p>\n<p>O solu\u021bie evident\u0103 este s\u0103 oferim utilizatorilor posibilitatea de a transfera date \u00eentre serviciile cloud. De exemplu, s\u0103 importe \u0219i s\u0103 exporte date ca fi\u0219iere, care apoi pot fi \u00eenc\u0103rcate \u00een serviciul dorit. De obicei, fi\u0219ierele sunt adaptate la formatul fiec\u0103rui serviciu. Este o munc\u0103 manual\u0103 mai mult sau mai pu\u021bin simpl\u0103, dar odat\u0103 cu cre\u0219terea num\u0103rului acestor servicii, devine tot mai complicat de realizat.<\/p>\n<p>Prin urmare, urm\u0103torul pas este API-ul. Cu acesta, serviciul cloud c\u00e2\u0219tig\u0103 prin interconectarea mai multor servicii \u00eentr-un singur punct. Apari\u021bia unei astfel de ecosisteme atrage clien\u021bi noi datorit\u0103 oportunit\u0103\u021bilor suplimentare. Un produs cu o func\u021bionalitate nou\u0103 devine mai avantajos \u0219i util.<\/p>\n<p>Dac\u0103 se creeaz\u0103 interfe\u021be proprii de programare, acestea atrag v\u00e2nz\u0103tori externi, sub form\u0103 de programatori care cunosc produsul datorit\u0103 API-ului. Ace\u0219tia \u00eencep s\u0103 construiasc\u0103 solu\u021bii bazate pe API-ul propus \u0219i c\u00e2\u0219tig\u0103 bani din automatizarea sarcinilor clien\u021bilor lor.<\/p>\n<p>Sistemul de contabilitate al MeuStoc se bazeaz\u0103 pe procese simple. Principalul lucru este lucrul cu documentele primare, posibilitatea de a efectua recep\u021bia \u0219i livrarea bunurilor, ob\u021binerea de rapoarte pentru afaceri pe baza documentelor primare. De asemenea, exist\u0103 transferul de date, de exemplu c\u0103tre contabilitatea cloud, \u0219i ob\u021binerea acestora din sistemele bancare sau din punctele de v\u00e2nzare cu am\u0103nuntul. De asemenea, lucr\u0103m cu magazinele online: ob\u021binem informa\u021bii despre produse \u0219i trimitem date despre stocuri.<\/p>\n<p><img decoding=\"async\" alt=\"Am scris API \u2014 am rupt XML (dou\u0103)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Primul API al MeuStoc<\/h2>\n<p>\n\u00cen cei 10 ani de activitate a MeuStoc cu API, am acumulat diverse integra\u021bii care permit schimbul de date, lucrul cu b\u0103ncile, efectuarea de pl\u0103\u021bi \u0219i utilizarea telefoniei externe.<\/p>\n<p>\u00cen primul an, am creat posibilitatea de a exporta orice date \u00een format XML. Atunci, utilizatorilor le era mult mai clar \u0219i mai familiar s\u0103 p\u0103streze datele offline, nu \u00een vreun cloud, \u0219i le-am oferit acest lucru. Exportul era ini\u021biat printr-un export manual din interfa\u021b\u0103. A\u0219adar, acest API nu putea fi numit \u00eenc\u0103. <\/p>\n<p>Atunci am \u00eenceput colaborarea cu compania Rusagro \u2014 ei foloseau deja un ERP \u201ematur\u201d pentru planificarea produc\u021biei \u0219i v\u00e2nz\u0103rilor, iar \u00eenc\u0103rcarea vagoanelor la fabrici era automatizat\u0103 \u00een MeuStoc. A\u0219a au ap\u0103rut primele \u00eenceputuri ale unui API adev\u0103rat: schimbul \u00eentre serviciul nostru \u0219i ERP se realiza prin trimiterea unui fi\u0219ier mare cu date despre toate tipurile de documente. <\/p>\n<p>Aceasta era o op\u021biune bun\u0103 pentru schimbul de date \u00een vrac, dar \u00eempreun\u0103 cu documentele trebuia s\u0103 transmitem \u0219i dependen\u021bele acestora: informa\u021bii despre produse, parteneri \u0219i depozite. O astfel de amestec\u0103tur\u0103 nu este greu de generat la export, dar este destul de greu de descompus la import, deoarece \u00een acela\u0219i pachet ajung toate informa\u021biile: at\u00e2t despre documentele noi, c\u00e2t \u0219i despre cele existente.<\/p>\n<p>Primul XML API nu a durat mult \u2014 dup\u0103 doi ani am \u00eenceput restructurarea lui. Chiar de la \u00eenceputul activit\u0103\u021bii sale, am f\u0103cut c\u00e2teva gre\u0219eli \u00een construirea interfe\u021bei de programare.<\/p>\n<p><img decoding=\"async\" alt=\"Am scris API \u2014 am rupt XML (dou\u0103)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Cum a fost realizat XML API: ilustra\u021bie de la unul dintre arhitec\u021bii no\u0219tri. Apropo, a\u0219tepta\u021bi articolele lui.<\/i><\/p>\n<p>Iat\u0103 gre\u0219elile noastre principale:<\/p>\n<ol>\n<li>Markup-ul JAXB a fost realizat direct pe entity beans. Pentru comunicarea cu baza de date, folosim Hibernate, iar pe acelea\u0219i bean-uri a fost realizat markup-ul JAXB. Aceast\u0103 gre\u0219eal\u0103 a ap\u0103rut aproape imediat: orice actualizare a structurii de date ducea la necesitatea de a anun\u021ba urgent pe to\u021bi cei care folosesc API-ul, fie prin construirea de solu\u021bii temporare care s\u0103 asigure compatibilitatea cu structura de date anterioar\u0103.<\/li>\n<li>API a evoluat ca un fel de supliment, \u0219i ini\u021bial nu am definit ce parte a produsului reprezint\u0103. Nu ne-am g\u00e2ndit nici m\u0103car dac\u0103 API-ul este ceva important, dac\u0103 trebuie s\u0103 men\u021binem compatibilitatea \u00eenapoi pentru primii s\u0103i clien\u021bi. La un moment dat, num\u0103rul utilizatorilor API-ului era de aproximativ 5% din num\u0103rul total, \u0219i nu am acordat aten\u021bie acestora. Filtrarea universal\u0103 realizat\u0103 la vremea respectiv\u0103 a dus la faptul c\u0103 am devenit utiliza\u021bi ca backend. Aceast\u0103 filtrare nu era deloc GraphQL, dar era ceva similar \u2014 func\u021biona printr-o mul\u021bime de parametri \u00eenchisi \u00een interogarea de solicitare. Cu un instrument at\u00e2t de puternic, utilizatorilor le-a fost greu s\u0103 se ab\u021bin\u0103, \u0219i ne-au redirec\u021bionat solicit\u0103rile astfel \u00eenc\u00e2t acestea s\u0103 fie trimise direct de la UI-urile magazinelor lor online. Situa\u021bia a fost o surpriz\u0103 nepl\u0103cut\u0103, deoarece oferirea unui astfel de serviciu ar trebui s\u0103 necesite o tarifare diferit\u0103 \u0219i o \u00een\u021belegere complet diferit\u0103 a API-ului ca produs.<\/li>\n<li>Din cauza faptului c\u0103 API-ul s-a dezvoltat nu ca un produs principal, documenta\u021bia API-ului a fost realizat\u0103 \u0219i publicat\u0103 ca o m\u0103sur\u0103 de urgen\u021b\u0103 \u2014 prin inginerie invers\u0103. Aceast\u0103 abordare pare a fi destul de simpl\u0103 \u0219i convenabil\u0103, dar contravine contractului de munc\u0103. Aceasta este c\u00e2nd exist\u0103 un anumit component cu o schem\u0103 de func\u021bionare prestabilit\u0103. Dezvoltatorul \u00eel implementeaz\u0103 conform acestei scheme \u0219i sarcinii, componentul este testat, clientul prime\u0219te un produs care corespunde viziunii analistului. Ingineria invers\u0103, pe de alt\u0103 parte, ofer\u0103 pia\u021bei un produs care pur \u0219i simplu exist\u0103: cu solu\u021bii improvizate, decizii ciudate \u0219i \u201ebiciclete\u201d \u00een loc de func\u021bionalitatea dorit\u0103. <\/li>\n<li>\u00centreaga flux de solicit\u0103ri care venea prin API putea fi analizat nu mai mult dec\u00e2t un log de Nginx sau un server de aplica\u021bii. Aceasta nu permitea s\u0103 fie identificate domeniile tematice, dec\u00e2t s\u0103 fie \u00eemp\u0103r\u021bit pe utilizatori \u0219i abona\u021bi. Dac\u0103 nu exist\u0103 posibilitatea de a regla \u00eenregistrarea aplica\u021biei sau a clien\u021bilor, analiza situa\u021biei devine imposibil\u0103. Aceast\u0103 problem\u0103 a afectat \u00een mic\u0103 m\u0103sur\u0103 dezvoltarea API-ului, mai mult fiind vorba despre \u00een\u021belegerea cererii sale \u0219i a func\u021bionalit\u0103\u021bii sale.<\/li>\n<\/ol>\n<p><\/p>\n<h2>\u00cencercarea num\u0103rul dou\u0103: REST API<\/h2>\n<p>\n\u00cen 2010, am \u00eencercat s\u0103 construim un sistem de schimb cu un serviciu de contabilitate online \u2014 BuxSoft. Nu a func\u021bionat. Totu\u0219i, \u00een procesul de integrare a ap\u0103rut un API complet func\u021bional: un serviciu REST de schimb, unde nu existau derapaje precum apelurile RPC pentru opera\u021biuni. Toat\u0103 comunicarea cu API-ul a fost redus\u0103 la un mod standard pentru REST: \u00een stringul de cerere se con\u021bine denumirea entit\u0103\u021bii, iar opera\u021biunea care se efectueaz\u0103 cu ea este specificat\u0103 prin metoda http. Am ad\u0103ugat filtrare \u00een func\u021bie de momentul actualiz\u0103rii entit\u0103\u021bilor, iar utilizatorii au avut posibilitatea de a construi replic\u0103ri cu sistemele lor.<\/p>\n<p>\u00cen acela\u0219i an, a ap\u0103rut un API pentru exportul stocurilor \u0219i a bunurilor disponibile. Utilizatorii au avut acces prin API la cele mai valoroase p\u0103r\u021bi ale sistemului \u2014 schimbul de documente primare \u0219i datele de calcul referitoare la stocuri \u0219i costurile bunurilor.<\/p>\n<p>\u00cen decembrie 2015, RetailCRM a publicat prima bibliotec\u0103 extern\u0103 pentru accesarea API-ului nostru. A fost utilizat\u0103 destul de activ, iar \u00een acela\u0219i timp, popularitatea serviciului \u00een general a crescut, iar \u00eenc\u0103rcarea pe API a crescut mai repede dec\u00e2t pe interfa\u021ba web. Odat\u0103, cre\u0219terea s-a transformat \u00eentr-un salt al \u00eenc\u0103rc\u0103rii. <\/p>\n<p><img decoding=\"async\" alt=\"Am scris API \u2014 am rupt XML (dou\u0103)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Am scris API \u2014 am rupt XML (dou\u0103)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0218i acest salt, la care se refer\u0103 s\u0103geata din st\u00e2nga, a dus la o mare uimire a serverului care deservesc API-ul nostru. O s\u0103pt\u0103m\u00e2n\u0103 am \u00eencercat s\u0103 \u00een\u021belegem ce anume genereaz\u0103 aceast\u0103 \u00eenc\u0103rcare. S-a dovedit c\u0103 acestea erau exact acele cereri transmise c\u0103tre API-ul nostru de front-end-urile clien\u021bilor. Aproximativ 50 de clien\u021bi au consumat totul. Atunci am realizat una dintre gre\u0219elile noastre \u2014 absen\u021ba total\u0103 a limitelor. <\/p>\n<p>\u00cen cele din urm\u0103, am introdus o limit\u0103 pentru num\u0103rul de cereri simultane. De pe un singur cont, acum putea fi deschise simultan nu mai mult de dou\u0103 cereri. Acest lucru este suficient pentru a func\u021biona \u00een modul de replicare pentru schimbul de date \u00een mod de lot. Iar cei care doreau s\u0103 ne utilizeze ca backend au fost nevoi\u021bi s\u0103 se conformeze mai mult tarifelor, deoarece au introdus \u00een instrumentele lor software lucrul cu mai multe conturi.<\/p>\n<h2>Punt\u0103m lucrurile \u00een ordine<\/h2>\n<p>\n\u00cencep\u00e2nd din 2014, cererea pentru API-ul existent a devenit o parte important\u0103 a afacerii, iar API-ul genera cel mai mare volum de date \u00een schimbul de informa\u021bii cu clien\u021bii. \u00cen 2015, am lansat un proiect pentru aducerea API-ului \u00een ordine. Am ales formatul JSON \u00een loc de XML \u0219i am \u00eenceput s\u0103 \u00eel construim pe baza caracteristicilor pe care le-am identificat \u00een implementarea versiunii anterioare:<\/p>\n<ol>\n<li>Posibilitatea de a gestiona versiunile. Versiunea permite dezvoltarea unei noi versiuni, f\u0103r\u0103 a afecta aplica\u021bia existent\u0103 \u0219i f\u0103r\u0103 a perturba utilizatorii. <\/li>\n<li>Posibilitatea utilizatorului de a vedea metadatele \u00een r\u0103spunsul pe care \u00eel prime\u0219te.<\/li>\n<li>Posibilitatea de a schimba documente mari. Dac\u0103 proces\u0103m un document cu un num\u0103r de articole mai mare de 4-5 mii, acesta devine o problem\u0103 pentru server: tranzac\u021bie lung\u0103, cerere http lung\u0103. Am construit un mecanism special care permite actualizarea documentului pe p\u0103r\u021bi \u0219i gestionarea articolelor individuale din acest document, trimi\u021b\u00e2ndu-le pe server.<\/li>\n<li>Instrumente pentru replicare \u2014 au existat \u0219i \u00een versiunea anterioar\u0103.<\/li>\n<li>Limite de \u00eenc\u0103rcare \u2014 ca un mo\u0219tenitor al capcanelor \u00een care am c\u0103lcat \u00een versiunea anterioar\u0103. Am introdus limite pentru num\u0103rul de cereri \u00eentr-un interval de timp, num\u0103rul de cereri paralele \u0219i cererile de la o adres\u0103 IP.<\/li>\n<\/ol>\n<p>\nDe atunci, am lansat dou\u0103 versiuni minore ale API-ului \u0219i am ini\u021biat mai multe API-uri specializate, dar, \u00een general, abordarea a r\u0103mas neschimbat\u0103. Formatul actualizat de schimb \u0219i noua arhitectur\u0103 au permis corectarea deficien\u021belor din API mult mai repede.<\/p>\n<h2>API-ul MeuStoc ast\u0103zi<\/h2>\n<p>\nAst\u0103zi, API-ul MeuStoc rezolv\u0103 multe probleme:<\/p>\n<ul>\n<li>schimb de date cu magazinele online, sisteme de contabilitate, b\u0103nci;<\/li>\n<li>ob\u021binerea datelor de calcul, rapoartelor;<\/li>\n<li>utilizat ca backend pentru aplica\u021biile client \u2014 aplica\u021biile noastre mobile \u0219i casa de marcat pe desktop func\u021bioneaz\u0103 prin API<\/li>\n<li>trimiterea notific\u0103rilor despre modific\u0103rile datelor din MeuStoc \u2014 webhooks;<\/li>\n<li>telefoniia;<\/li>\n<li>sisteme de loialitate.<\/li>\n<\/ul>\n<p>\nPe baza API-ului, directorul nostru general, Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhino<\/a><\/noindex> a scris \u00een patru ore un bot de Telegram, care preia prin API stocurile: <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>Acum cifrele uscate. <\/p>\n<p>Iat\u0103 statistica noastr\u0103 pentru vechiul API REST:<\/p>\n<ul>\n<li>400 companii;<\/li>\n<li>600 utilizatori;<\/li>\n<li>2 milioane de cereri pe zi;<\/li>\n<li>200 Gb\/zi trafic ie\u0219it.<\/li>\n<\/ul>\n<p>\n\u0218i iat\u0103 la ce am ajuns \u00een toate API-urile MeuStoc:<\/p>\n<ul>\n<li>peste 70 de integra\u021bii (o parte dintre ele pot fi vizualizate aici <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integratsii<\/a><\/noindex>);<\/li>\n<li>8500 de companii;<\/li>\n<li>12 000 de utilizatori;<\/li>\n<li>46 de milioane de cereri pe zi;<\/li>\n<li>2 Tb\/zi trafic ie\u0219it.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ce urmeaz\u0103<\/h2>\n<p>\nPlanurile de dezvoltare a API-ului sunt \u00een discu\u021bii active. Ne str\u0103duim s\u0103 lu\u0103m \u00een considerare experien\u021ba de utilizare oferit\u0103 de utilizatori. Nu totul poate fi realizat imediat, dar o nou\u0103 versiune a API-ului cu metadate mai convenabile \u0219i o structur\u0103 mai compact\u0103, OAuth pentru autentificare \u0219i API pentru aplica\u021biile integrate \u00een interfa\u021b\u0103 este aproape. <\/p>\n<p>Pute\u021bi urm\u0103ri nout\u0103\u021bile pe un site special dedicat dezvoltatorilor care integreaz\u0103 cu MoimSklad: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.moysklad.ru<\/a><\/noindex>.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Am scris API \u2013 am spart XML (dou\u0103) | ProHoster","description":"Primul API al MeuStoc a ap\u0103rut acum 10 ani. \u00cen tot acest timp, am lucrat la versiunile existente ale API-ului \u0219i dezvolt\u0103m altele noi. Iar c\u00e2teva versiuni ale API-ului au fost deja \u201e\u00eengropate\u201d.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/34354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}