lumnik. / scénarios Tous les scénarios · English

PrestaShop: le catalogue XML lu en une ligne

Objectif Lire tous les produits d'une boutique PrestaShop 8 par son Webservice, en XML, tel qu'il répond.

Un vrai PrestaShop 8.2.8 et son catalogue de démo. Son Webservice répond en XML.

products.xml
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<products>
<product>
	<id><![CDATA[1]]></id>
	<reference><![CDATA[demo_1]]></reference>
	<price><![CDATA[23.900000]]></price>
	<name><language id="1" xlink:href="http://host.docker.internal:9320/api/languages/1"><![CDATA[Hummingbird printed t-shirt]]></language></name>
</product>
</products>
</prestashop>
manifests/10-products-xml.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-prestashop-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9320/webservice  auth: { kind: api-key, in: query, name: ws_key, value_env: SCENARIO_PRESTASHOP_A_KEY }  endpoints:    - id: products      path: /dispatcher.php?url=products&display=[id,reference,price,name]      method: GET      pagination: { kind: offset, offset_param: offset, limit_param: limit, limit: 5, response_path: $.products }      target:        kind: hybrid        table: ext.scenario_prestashop_a        unique_key: $.id        promote:          - { name: reference, path: $.reference, type: text }          - { name: price, path: $.price, type: text }
manifests/20-products-offset.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-prestashop-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9320/webservice  auth: { kind: api-key, in: query, name: ws_key, value_env: SCENARIO_PRESTASHOP_A_KEY }  endpoints:    - id: products      path: /dispatcher.php?url=products&display=[id,reference,price,name]      method: GET      response_format: xml                                # the shop answers XML      pagination: { kind: offset, offset_param: offset, limit_param: limit, limit: 5, response_path: $.products.product }      target:        kind: hybrid        table: ext.scenario_prestashop_a        unique_key: $.id        promote:          - { name: reference, path: $.reference, type: text }          - { name: price, path: $.price, type: decimal }          - { name: name, path: "$.name.language['#text']", type: text }
products.xml
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<products>
<product>
	<id><![CDATA[1]]></id>
	<reference><![CDATA[demo_1]]></reference>
	<price><![CDATA[23.900000]]></price>
	<name><language id="1" xlink:href="http://host.docker.internal:9320/api/languages/1"><![CDATA[Hummingbird printed t-shirt]]></language></name>
</product>
</products>
</prestashop>

Limites

  • Un document XML qui déclare une DTD ou une entité est refusé: lumnik n'en lit jamais.
  • Les valeurs arrivent en texte: le prix est promu en decimal pour être comparé.
  • Le catalogue de démo de PrestaShop: 19 produits; une clé jetable, tirée à chaque rejeu.

E-commerce · catalogue

Le catalogue est dans PrestaShop.

Il faut lire tous les produits, chaque nuit.

PrestaShop 8.2.8, son catalogue de démo

Le problème

PrestaShop répond en XML.

  • Pas en JSON, comme la plupart des API.
  • Et il pagine à sa façon: limit=0,50.

Ce qui n'est pas modifié

La boutique reste telle quelle.

  • Son Webservice, une clé en lecture seule.
  • Aucun module, aucun réglage.

Le premier essai

Le hub refuse l'XML qu'on ne lui a pas annoncé.

  • Il ne lit jamais zéro produit en silence.
  • Il dit le mot à ajouter.

Ce qu'il a fallu écrire

response_format: xml
pagination: { kind: prestashop }

Deux lignes.

  • 19 produits sur 19, nom et prix.
  • Un connecteur de 25 lignes.

Ce qui a été corrigé

Trois trous trouvés, trois corrections.

  • Le hub lit l'XML.
  • Une page répétée fait échouer la lecture.
  • Le preset prestashop.

La limite

Un XML lisible et sûr.

  • Pas de DTD ni d'entité: refusés.
  • Les valeurs arrivent en texte.

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →