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

Le transporteur attend son curseur dans un en-tête sinon le run échoue

Objectif Lire tous les événements de suivi d'un transporteur dont l'API attend le curseur de page dans un en-tête de requête.

L'API de suivi d'un transporteur pagine par curseur. Elle le lit dans l'en-tête X-Next-Cursor, et nulle part ailleurs:

events
100
has_more
true
next_cursor
eyJvIjogMTAwfQ==

preuves: replay.log, page-1.json, requests-query.txt, requests-header.txt, parcels-by-status.txt, count.txt · transform v1

manifests/10-events-query.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-carrier-a  connector_type: rest-generic  scopes: [transport]spec:  base_url: http://host.docker.internal:9240  auth: { kind: bearer, token_env: SCENARIO_CARRIER_TOKEN }  endpoints:    - id: events      path: /v2/tracking-events      method: GET      pagination:        kind: cursor        cursor_param: cursor              # sent as ?cursor=… — the default binding        cursor_path: $.next_cursor        has_more_path: $.has_more        response_path: $.events      target:        kind: hybrid        table: ext.scenario_carrier_a        unique_key: $.event_id        promote:          - { name: parcel, path: $.parcel, type: text }          - { name: status, path: $.status, type: text }          - { name: at, path: $.at, type: timestamptz }
manifests/20-events-header.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-carrier-a  connector_type: rest-generic  scopes: [transport]spec:  base_url: http://host.docker.internal:9240  auth: { kind: bearer, token_env: SCENARIO_CARRIER_TOKEN }  endpoints:    - id: events      path: /v2/tracking-events      method: GET      pagination:        kind: cursor        cursor_binding: header            # the carrier reads its cursor from a header        cursor_param: X-Next-Cursor        cursor_path: $.next_cursor        has_more_path: $.has_more        response_path: $.events      target:        kind: hybrid        table: ext.scenario_carrier_a        unique_key: $.event_id        promote:          - { name: parcel, path: $.parcel, type: text }          - { name: status, path: $.status, type: text }          - { name: at, path: $.at, type: timestamptz }
hub
1200 events, 300 parcels
AVISE
60 parcels
EN_LIVRAISON
60 parcels
EN_TRANSIT
60 parcels
LIVRE
60 parcels
PRIS_EN_CHARGE
60 parcels

preuves: replay.log, page-1.json, requests-query.txt, requests-header.txt, parcels-by-status.txt, count.txt · transform v1

Limites

  • Le refus reconnaît une source qui renvoie le curseur qu'elle vient de recevoir. Une source qui renverrait des pages au hasard ne serait pas reconnue.
  • Sans total publié par l'API, aucun témoin ne compare le compte lu au compte réel.
  • API de transporteur simulée, événements synthétiques.

Transport · suivi des colis

Le transporteur publie 1200 événements de suivi.

L'import doit tous les lire, page après page.

API de transporteur simulée

Le problème

L'API attend la page suivante dans un en-tête.

  • Envoyée ailleurs, elle est ignorée.
  • L'API renvoie alors la première page.
  • Elle dit pourtant qu'il en reste.

Ce qui n'est pas modifié

L'API reste telle quelle.

  • Un jeton du transporteur, rangé par lm secret.
  • Aucun développement côté transporteur.

Ce qu'il a fallu écrire

cursor_binding: header
cursor_param: X-Next-Cursor

Dire où va le curseur.

Un connecteur de 30 lignes.

Le rouge

Curseur mal placé: le run échoue.

  • Il dit pourquoi, et quelle clé vérifier.
  • Aucune lecture partielle annoncée complète.

Le vert

1200 événements, 12 pages.

  • 300 colis, chacun avec son dernier statut.
  • Le curseur part dans l'en-tête à chaque page.

La limite

Le refus suppose que l'API répète sa page.

  • Une API qui renverrait des pages au hasard ne serait pas reconnue.
  • Le témoin du compte reste le total qu'elle publie, si elle en publie un.

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 →