{"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\/es\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","title":{"rendered":"Escribimos API \u2014 rompimos XML (dos)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>La primera API de Mi Almac\u00e9n apareci\u00f3 hace 10 a\u00f1os. Durante todo este tiempo hemos estado trabajando en las versiones existentes de la API y desarrollando nuevas. Ya hemos enterrado varias versiones de la API. <\/p>\n<p>En este art\u00edculo encontrar\u00e1s mucho: c\u00f3mo se cre\u00f3 la API, por qu\u00e9 es necesaria para los servicios en la nube, qu\u00e9 beneficios ofrece a los usuarios, en qu\u00e9 tropiezos hemos ca\u00eddo y qu\u00e9 queremos hacer a continuaci\u00f3n. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMe llamo Oleg Alekseev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/oalexeev\/\" class=\"user_link\">oalexeev<\/a><\/noindex>, soy el director t\u00e9cnico y cofundador de Mi Almac\u00e9n. <\/p>\n<h2>\u00bfPor qu\u00e9 hacer una API para el servicio?<\/h2>\n<p>\nNuestros clientes, que son decenas de miles de emprendedores, utilizan activamente soluciones en la nube: banca, tiendas en l\u00ednea, gesti\u00f3n de inventarios, CRM. Se conectan a una, y ya es dif\u00edcil detenerse. Y as\u00ed, el quinto, octavo, d\u00e9cimo servicio facilita el trabajo del emprendedor, pero los datos entre estos servicios en la nube los usuarios los trasladan manualmente. El trabajo se convierte en una pesadilla.<\/p>\n<p>La soluci\u00f3n obvia es dar a los usuarios la posibilidad de transferir datos entre servicios en la nube. Por ejemplo, importar y exportar datos como archivos, que luego se pueden cargar en el servicio necesario. Los archivos generalmente se modifican seg\u00fan el formato de cada servicio. Esto es un trabajo manual m\u00e1s o menos simple, pero a medida que aumenta la cantidad de estos servicios, se vuelve cada vez m\u00e1s dif\u00edcil realizarlo.<\/p>\n<p>Por lo tanto, el siguiente paso es la API. Con ella, el servicio en la nube se beneficia al conectar varios servicios en un solo punto. La aparici\u00f3n de un ecosistema as\u00ed atrae nuevos clientes gracias a las capacidades adicionales. Un producto con nuevas funcionalidades se vuelve m\u00e1s rentable y \u00fatil.<\/p>\n<p>Si se crean interfaces de programaci\u00f3n propias, esto atrae a vendedores externos en forma de programadores que conocen su producto gracias a la API. Comienzan a construir soluciones basadas en la API ofrecida y ganan dinero automatizando las tareas de sus clientes.<\/p>\n<p>El sistema de contabilidad de Mi Almac\u00e9n se basa en procesos simples. Lo principal es trabajar con documentos primarios, poder recibir y enviar mercanc\u00edas, obtener informes basados en los documentos primarios para el negocio. Tambi\u00e9n hay transferencia de datos, por ejemplo, a la contabilidad en la nube, y su obtenci\u00f3n de sistemas bancarios o puntos de venta. Adem\u00e1s, trabajamos con tiendas en l\u00ednea: obtenemos informaci\u00f3n sobre productos y enviamos datos sobre existencias.<\/p>\n<p><img decoding=\"async\" alt=\"Escribimos API \u2014 rompimos XML (dos)\" src=\"\/wp-content\/uploads\/2019\/05\/aefa36019217c463d2a513a9e025ebc7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>La primera API de Mi Almac\u00e9n<\/h2>\n<p>\nA lo largo de los 10 a\u00f1os de trabajo de Mi Almac\u00e9n con la API, hemos acumulado diversas integraciones que permiten intercambiar datos, trabajar con bancos, realizar pagos y utilizar telefon\u00eda externa.<\/p>\n<p>En el primer a\u00f1o, habilitamos la posibilidad de exportar cualquier dato en formato XML. En ese entonces, a los usuarios les resultaba mucho m\u00e1s comprensible y habitual mantener los datos de manera offline, en lugar de en una nube, y les proporcionamos eso. La exportaci\u00f3n se iniciaba mediante una exportaci\u00f3n manual desde la interfaz. As\u00ed que no se pod\u00eda llamar API en ese momento. <\/p>\n<p>Ese mismo a\u00f1o comenzamos a colaborar con la empresa Rusagro: ellos ya utilizaban un ERP 'maduro' para la planificaci\u00f3n de producci\u00f3n y ventas, mientras que en Mi Almac\u00e9n automatizamos la carga de vagones en las f\u00e1bricas. As\u00ed tuvimos los primeros indicios de una API real: el intercambio entre nuestro servicio y el ERP se realizaba al enviar un gran archivo con datos sobre todos los tipos de documentos. <\/p>\n<p>Esta era una buena opci\u00f3n para el intercambio de datos por lotes, pero junto con los documentos, era necesario transmitir sus dependencias: informaci\u00f3n sobre productos, contrapartes y almacenes. Este tipo de acumulaci\u00f3n no es dif\u00edcil de generar en la exportaci\u00f3n, pero resulta bastante complicado desglosar en la importaci\u00f3n, ya que en un \u00fanico paquete llegan todos los datos: tanto sobre nuevos documentos como sobre los ya existentes.<\/p>\n<p>La primera API XML no dur\u00f3 mucho: despu\u00e9s de dos a\u00f1os comenzamos su reconstrucci\u00f3n. Desde el inicio de su funcionamiento cometimos varios errores al construir la interfaz de programaci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"Escribimos API \u2014 rompimos XML (dos)\" src=\"\/wp-content\/uploads\/2019\/05\/3f1b04d030e7fcb5add795f8fd75d92b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>As\u00ed se cre\u00f3 la API XML: ilustraci\u00f3n de uno de nuestros arquitectos. Por cierto, esperen sus art\u00edculos.<\/i><\/p>\n<p>Estos son nuestros principales errores:<\/p>\n<ol>\n<li>La marcaci\u00f3n JAXB se realiz\u00f3 directamente sobre los entity beans. Para comunicarnos con la base de datos utilizamos Hibernate, y sobre esos mismos beans se hizo la marcaci\u00f3n JAXB. Este error se evidenci\u00f3 casi de inmediato: cualquier actualizaci\u00f3n en la estructura de datos requer\u00eda una urgente notificaci\u00f3n a todos los que utilizan la API, o la construcci\u00f3n de parches que garantizaran la compatibilidad con la estructura de datos anterior.<\/li>\n<li>La API surgi\u00f3 como un complemento y, al principio, no definimos qu\u00e9 parte del producto representaba. No consideramos si la API era algo importante ni si deb\u00edamos mantener la compatibilidad hacia atr\u00e1s para sus primeros clientes. En un momento, el n\u00famero de usuarios de la API representaba alrededor del 5% del peque\u00f1o n\u00famero total, y no se les prest\u00f3 atenci\u00f3n. La filtraci\u00f3n universal que se llev\u00f3 a cabo en su momento llev\u00f3 a que nos comenzaran a usar como backend. Esta filtraci\u00f3n no era exactamente GraphQL, sino algo parecido: funcionaba a trav\u00e9s de una gran cantidad de par\u00e1metros en la cadena de consulta. Con una herramienta tan poderosa, a los usuarios les result\u00f3 dif\u00edcil resistirse, y comenzaron a enviar solicitudes directamente desde la interfaz de usuario de sus tiendas en l\u00ednea. La situaci\u00f3n se convirti\u00f3 en una desagradable sorpresa, ya que ofrecer tal servicio deber\u00eda requerir un esquema de precios diferente y una comprensi\u00f3n completamente distinta de la API como producto.<\/li>\n<li>Debido a que la API no se desarroll\u00f3 como producto principal, la documentaci\u00f3n de la API se elabor\u00f3 y public\u00f3 de manera residual, a trav\u00e9s de ingenier\u00eda inversa. Este camino parece bastante simple y conveniente, pero contradice el trabajo contractual. Esto es cuando hay un componente con un esquema de funcionamiento preestablecido. El desarrollador lo implementa de acuerdo con este esquema y la tarea, el componente pasa pruebas, el cliente recibe un producto que coincide con la idea del analista. La ingenier\u00eda inversa, por otro lado, lanza al mercado un producto que simplemente existe: con parches, soluciones extra\u00f1as y bicicletas en lugar de la funcionalidad necesaria. <\/li>\n<li>Todo el flujo de solicitudes que llegaba a trav\u00e9s de la API solo pod\u00eda ser analizado como un registro de Nginx o del servidor de aplicaciones. Esto no permit\u00eda identificar \u00e1reas espec\u00edficas, salvo dividir por usuarios y suscriptores. Si no hay forma de regular el registro de aplicaciones o clientes, se vuelve imposible analizar la situaci\u00f3n. Este problema afect\u00f3 en menor medida el desarrollo de la API; se trata m\u00e1s de entender su demanda y el contenido funcional que ofrece.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Intento n\u00famero dos: REST API<\/h2>\n<p>\nEn 2010, intentamos construir un sistema de intercambio con la contabilidad en l\u00ednea \u2014 BuchSoft. No funcion\u00f3. Sin embargo, durante el proceso de integraci\u00f3n, se desarroll\u00f3 una API completa: un servicio REST de intercambio, donde no hab\u00eda libertades como las llamadas a operaciones en forma de invocaciones RPC. Toda la comunicaci\u00f3n con la API se ajust\u00f3 al modo est\u00e1ndar para REST: en la cadena de solicitud se incluye el nombre de la entidad, y la operaci\u00f3n que se realiza con ella se establece mediante el m\u00e9todo HTTP. A\u00f1adimos filtrado por el momento de actualizaci\u00f3n de entidades, y ahora los usuarios tienen la posibilidad de construir replicaci\u00f3n con sus sistemas.<\/p>\n<p>Ese mismo a\u00f1o, se lanz\u00f3 la API para la exportaci\u00f3n de existencias y mercanc\u00edas. A trav\u00e9s de la API, las partes m\u00e1s valiosas del sistema se hicieron accesibles para los usuarios: el intercambio de documentos primarios y los datos de c\u00e1lculo sobre existencias y costos de las mercanc\u00edas.<\/p>\n<p>En diciembre de 2015, RetailCRM public\u00f3 la primera biblioteca de tercero para acceder a nuestra API. Esta se empez\u00f3 a utilizar de manera bastante activa, y al mismo tiempo creci\u00f3 la popularidad del servicio en general, la carga en la API aument\u00f3 m\u00e1s r\u00e1pido que la carga en la interfaz web. Una vez, el crecimiento se convirti\u00f3 en un salto de carga. <\/p>\n<p><img decoding=\"async\" alt=\"Escribimos API \u2014 rompimos XML (dos)\" src=\"\/wp-content\/uploads\/2019\/05\/86b289455db8a13f5583cd4eeb377970.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Escribimos API \u2014 rompimos XML (dos)\" src=\"\/wp-content\/uploads\/2019\/05\/da221a6a122ff6d15bcbf9ea09758727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nY este salto, al que apunta la flecha de la izquierda, dej\u00f3 completamente asombrado al servidor que atiende nuestra API. Pasamos una semana averiguando qu\u00e9 generaba exactamente esa carga. Result\u00f3 que eran esas mismas solicitudes que se transmit\u00edan a nuestra API desde los frontales de los clientes. Alrededor de 50 clientes fueron responsables. En ese momento entendimos uno de nuestros errores: la total ausencia de l\u00edmites. <\/p>\n<p>Como resultado, introdujimos un l\u00edmite en el n\u00famero de solicitudes simult\u00e1neas. Desde una cuenta, ahora se pueden abrir no m\u00e1s de dos solicitudes al mismo tiempo. Esto es suficiente para trabajar en modo de replicaci\u00f3n para el intercambio de datos en modo por lotes. Aquellos que quer\u00edan utilizarlo como backend, a partir de ahora, tendr\u00edan que ajustarse m\u00e1s a las tarifas, ya que introdujimos el uso de m\u00faltiples cuentas en sus herramientas de software.<\/p>\n<h2>Ordenando<\/h2>\n<p>\nDesde 2014, la demanda de la API existente se convirti\u00f3 en una parte importante del negocio, y la propia API generaba el mayor volumen de datos en el intercambio de informaci\u00f3n con los clientes. En 2015, lanzamos un proyecto para poner en orden la API. Elegimos el formato JSON en lugar de XML y comenzamos a construirlo sobre la base de las caracter\u00edsticas que identificamos al implementar la versi\u00f3n anterior:<\/p>\n<ol>\n<li>La capacidad de gestionar versiones. La versionado permite desarrollar una nueva versi\u00f3n sin afectar la aplicaci\u00f3n existente ni interrumpir a los usuarios. <\/li>\n<li>La posibilidad de que el usuario vea los metadatos en la respuesta que recibe.<\/li>\n<li>La posibilidad de intercambiar grandes documentos. Si procesamos un documento con m\u00e1s de 4-5 mil \u00edtems, esto se convierte en un problema para el servidor: transacciones largas, solicitudes http largas. Se construy\u00f3 un mecanismo especial que permite actualizar documentos en partes y gestionar \u00edtems individuales de ese documento, envi\u00e1ndolos al servidor.<\/li>\n<li>Herramientas para la replicaci\u00f3n \u2014 estaban en la versi\u00f3n anterior.<\/li>\n<li>L\u00edmites de carga \u2014 como legado de los errores cometidos en la versi\u00f3n anterior. Se introdujeron l\u00edmites en el n\u00famero de solicitudes en un periodo de tiempo, el n\u00famero de solicitudes paralelas y solicitudes desde una misma direcci\u00f3n IP.<\/li>\n<\/ol>\n<p>\nDesde entonces hemos lanzado dos versiones menores de la API y hemos puesto en marcha varias APIs especializadas, pero en general el enfoque ha permanecido sin cambios. El formato de intercambio actualizado y la nueva arquitectura han permitido corregir las deficiencias de la API mucho m\u00e1s r\u00e1pido.<\/p>\n<h2>API de MiAlmac\u00e9n hoy<\/h2>\n<p>\nHoy, la API de MiAlmac\u00e9n resuelve muchas tareas:<\/p>\n<ul>\n<li>intercambio de datos con tiendas en l\u00ednea, sistemas contables, bancos;<\/li>\n<li>obtenci\u00f3n de datos de c\u00e1lculo, informes;<\/li>\n<li>uso como backend para aplicaciones de clientes \u2014 nuestras aplicaciones m\u00f3viles y el punto de venta de escritorio funcionan a trav\u00e9s de la API<\/li>\n<li>env\u00edo de notificaciones sobre cambios en los datos de MiAlmac\u00e9n \u2014 webhooks;<\/li>\n<li>telefon\u00eda;<\/li>\n<li>sistemas de lealtad.<\/li>\n<\/ul>\n<p>\nBasado en la API, nuestro director general Askar Rakhimberdiev <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/rhino\/\" class=\"user_link\">rhinocero<\/a><\/noindex> en cuatro horas escribi\u00f3 un bot de telegram que obtiene a trav\u00e9s de la API los saldos: <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>Ahora cifras secas. <\/p>\n<p>Aqu\u00ed est\u00e1n nuestras estad\u00edsticas sobre la antigua API REST:<\/p>\n<ul>\n<li>400 empresas;<\/li>\n<li>600 usuarios;<\/li>\n<li>2 millones de solicitudes al d\u00eda;<\/li>\n<li>200 Gb\/d\u00eda de tr\u00e1fico saliente.<\/li>\n<\/ul>\n<p>\nY aqu\u00ed estamos con todas las API de MiAlmac\u00e9n:<\/p>\n<ul>\n<li>m\u00e1s de 70 integraciones (parte de ellas se pueden ver aqu\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/www.moysklad.ru\/integratsii\/\">www.moysklad.ru\/integratsii<\/a><\/noindex>);<\/li>\n<li>8500 empresas;<\/li>\n<li>12,000 usuarios;<\/li>\n<li>46 millones de solicitudes al d\u00eda;<\/li>\n<li>2 Tb\/d\u00eda de tr\u00e1fico saliente.<\/li>\n<\/ul>\n<p><\/p>\n<h2>\u00bfQu\u00e9 sigue?<\/h2>\n<p>\nLos planes de desarrollo de la API est\u00e1n en discusi\u00f3n activa. Nos esforzamos por tener en cuenta la experiencia operativa que nos proporcionan los usuarios. No siempre podemos hacerlo todo de inmediato, pero se acerca una nueva versi\u00f3n de la API con metadatos m\u00e1s convenientes y una estructura menos compleja, as\u00ed como OAuth para la autenticaci\u00f3n y una API para integrar en las aplicaciones de interfaz. <\/p>\n<p>Puedes seguir las noticias en un sitio especial para desarrolladores que integran con MiAlmac\u00e9n: <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.moysklad.ru\">dev.mialmacen.ru<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <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 - 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\/es\/blog\/administrirovanie\/pisali-api-porvali-xml-dva\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Escribimos la API \u2014 rompimos XML (dos) | ProHoster","description":"La primera API de Mi Almac\u00e9n apareci\u00f3 hace 10 a\u00f1os. Durante todo este tiempo hemos estado trabajando en las versiones existentes de la API y desarrollando nuevas. Ya hemos enterrado varias versiones de la API.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pisali-api-porvali-xml-dva","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/34354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=34354"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/25898"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=34354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=34354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=34354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}