@unireq/xml
Parsing et sérialisation XML bâtis sur fast-xml-parser. L'objectif : intégrer du XML dans les mêmes chaînes de policies que vos transports HTTP ou IMAP, sans écrire de glue ad-hoc.
Installation
bash
pnpm add @unireq/xmlPanorama des exports
| Symbole | Description |
|---|---|
xml(options?) | Policy de réponse qui détecte content-type: *xml* et convertit le corps en objets JS via fast-xml-parser. |
xmlBody(data, builderOptions?) | Body descriptor application/xml (géré automatiquement par serializationPolicy). |
XMLParserOptions, XMLBuilderOptions | Types ré-exportés pour configurer précisément parser et builder. |
Parser les réponses
ts
import { client } from '@unireq/core';
import { http, headers } from '@unireq/http';
import { xml } from '@unireq/xml';
const api = client(
http('https://api.example.com'),
headers({ accept: 'application/xml' }),
xml({ ignoreAttributes: false, attributeNamePrefix: '@_' }),
);
const res = await api.get('/orders/123');
console.log(res.data.order.total);- La policy ne s'exécute que si
content-typecontientxml(insensible à la casse). Les autres réponses continuent dans la chaîne (par exemple versparse.json()). - Toutes les options
fast-xml-parsersont disponibles : préfixes, gestion des espaces, stratégie pour les tags vides, etc. - Placez
xml()juste après l'auth/retry pour que les tentatives rejouées soient parsées une seule fois au plus près du transport.
Sérialiser les requêtes
ts
import { xmlBody } from '@unireq/xml';
await api.post(
'/invoices',
xmlBody({ invoice: { id: 42, total: 99.9 } }, { format: true, indentBy: ' ' }),
);xmlBody()produit unBodyDescriptorstandard :serializationPolicy()s'occupe d'ajouterContent-Typeet d'écrire le payload.- Les options builder reflètent celles de
fast-xml-parser(format,indentBy,attributeNamePrefix, etc.).
Négocier JSON ↔ XML
ts
import { client, either } from '@unireq/core';
import { http, parse } from '@unireq/http';
import { xml } from '@unireq/xml';
const api = client(
http('https://hybrid.example.com'),
either(
(ctx) => ctx.headers.accept?.includes('json') ?? false,
parse.json(),
xml(),
),
);Même logique que httpsJsonAuthSmart : la policy either() choisit JSON quand le client le demande, sinon XML.
Conseils & pièges
- Erreurs de parsing : une réponse XML invalide lèvera une exception
fast-xml-parser; enveloppez le client dansretryou captez l'erreur si vous préférez renvoyer un objet métier. - Payloads volumineux : le parseur charge tout en mémoire. Pour des flux massifs, déportez la conversion côté serveur ou adoptez un parseur SAX.
- Namespaces SOAP : configurez
ignoreNameSpace/removeNSPrefixpour aplatir les préfixes (soapenv:Envelope). - Tests : utilisez les mêmes options que la prod pour éviter les snapshots divergents.