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

FastAPI: les 130 livraisons lues en une ligne

Objectif Lire toutes les livraisons d'un service FastAPI maison par son API, sans demander d'export à son équipe.

Un vrai service FastAPI avec fastapi-pagination 0.16.1 et 130 livraisons fictives.

manifests/lab-docker-compose.yml
name: lumnik-scenario-fastapiservices:  deliveries:    build: ../lab    ports: ["127.0.0.1:${FASTAPI_PORT:-9340}:8000"]
manifests/10-deliveries.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-fastapi-a  connector_type: rest-generic  scopes: [logistique]spec:  base_url: http://host.docker.internal:9340  endpoints:    - id: deliveries      path: /deliveries      method: GET      pagination: { kind: fastapi }                    # ?page=1&size=50, reads $.items, stops at $.pages      target:        kind: hybrid        table: ext.scenario_fastapi_a        unique_key: $.id        promote:          - { name: reference, path: $.reference, type: text }          - { name: city, path: $.city, type: text }          - { name: parcels, path: $.parcels, type: integer }
manifests/20-deliveries-500.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-fastapi-big-a  connector_type: rest-generic  scopes: [logistique]spec:  base_url: http://host.docker.internal:9340  endpoints:    - id: deliveries      path: /deliveries      method: GET      pagination: { kind: fastapi, size: 500 }        # fastapi-pagination caps size at 100      target:        kind: hybrid        table: ext.scenario_fastapi_big_a        unique_key: $.id        promote:          - { name: reference, path: $.reference, type: text }          - { name: city, path: $.city, type: text }          - { name: parcels, path: $.parcels, type: integer }
manifests/30-deliveries-size-in-path.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-fastapi-path-a  connector_type: rest-generic  scopes: [logistique]spec:  base_url: http://host.docker.internal:9340  endpoints:    - id: deliveries      path: /deliveries?size=500                     # the page size written in the path      method: GET      pagination: { kind: fastapi }                    # ?page=1&size=50, reads $.items, stops at $.pages      target:        kind: hybrid        table: ext.scenario_fastapi_path_a        unique_key: $.id        promote:          - { name: reference, path: $.reference, type: text }          - { name: city, path: $.city, type: text }          - { name: parcels, path: $.parcels, type: integer }

Limites

  • fastapi-pagination plafonne size à 100 par défaut; l'équipe du service peut changer cette limite.
  • 130 livraisons fictives, créées au démarrage du service.

Logistique · livraisons

Les livraisons sont dans un service maison.

L'équipe logistique l'a écrit en Python.

FastAPI, fastapi-pagination 0.16.1, 130 livraisons

Le problème

L'API rend la liste par pages.

  • page et size dans l'adresse.
  • Le total et le nombre de pages dans chaque réponse.

Ce qui n'est pas modifié

Le service reste tel quel.

  • Son API, telle que l'équipe l'a écrite.
  • Aucun export, aucun développement.

Ce qu'il a fallu écrire

pagination: { kind: fastapi }

Une ligne.

  • page=1, size=50, puis les suivantes.
  • Lit items, s'arrête à pages.
  • Un connecteur de 22 lignes.

Au calme

130 sur 130, en trois requêtes.

  • page=1, 2, 3, cinquante par page.
  • 130 lignes dans le hub.

Trop gros

500 par page: la bibliothèque refuse.

  • fastapi-pagination plafonne size à 100.
  • Son refus 422 arrive tel quel dans le run.
  • Rien n'est ingéré.

Ce qui a été corrigé

Un trou trouvé, une correction.

  • Avant: size=500 dans le path, envoyé deux fois, ignoré.
  • Maintenant: refusé dès lm apply (#1789).

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 →