Projet

Général

Profil

Autre #17175

point sur le mode "json-api", évolution/simplification

Ajouté par Frédéric Péters il y a presque 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
24 juin 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Je prends ce ticket à l'occasion de commentaires récents de ma part, comme quoi je n'étais pas à l'aise avec le mode "json-api", en preuve plutôt simple, d'un "git grep", j'ai l'impression que les connecteurs qui utilisent @endpoint sans "json-api", c'est uniquement ceux que j'ai développé moi :/

En guise d'inventaire/documentation, 'json-api', ça fait :

  • la mise de la réponse sous une clé 'data'
    • sauf si wrap_response=False est passé
    • sauf si la réponse est de type HttpResponse, alors c'est envoyé brut
  • l'ajout d'une clé 'err' à 0 de manière automatique
    • sauf si wrap_response=False est passé
  • l'attrapage des exceptions (sauf si ?raise=1 est passé dans l'URL)
    • si l'exception contient un attribut err_code, il est utilisé dans la clé 'err'.
    • si l'exception contient un attribut http_status, il est utilisé pour la réponse.
    • si c'est ObjectDoesNotExist ou Http404, c'est une 404 qui est produite.
    • si c'est PermissionDenied, une 403

Maintenant la discussion. Je me demande dans quel mesure, à l'exception du premier point, tout pourrait également se faire quand on ne précise rien; c'est à dire que sans rien préciser, ça reviendrait à json-api + wrap_response=False, + l'ajout de 'err' à 0 quand même.

De là, retirer de @endpoint les arguments serializer_type et wrap_response, ce qui simplifie tout à fait la documentation développeur, avec comme seule obligation la modification des connecteurs "json-api" actuels pour qu'ils modifient leur réponse pour la mettre dans une clé "data".

Question code, ça pourrait commencer sans rien changer (d'autre que la clé "data") mais à terme je serais tenté par dégager passerelle/utils/jsonresponse.py, dont je n'aime pas le code (mais 80% ça doit être la chaine de doctest).


Fichiers


Demandes liées

Lié à Passerelle - Development #17169: json data store : passer en mode json-api {err:0, data:...}Fermé24 juin 2017

Actions

Révisions associées

Révision 2eeeeb74 (diff)
Ajouté par Frédéric Péters il y a presque 7 ans

general: switch to json-api/wrap_response:False as endpoint default (#17175)

Révision 46549bd8 (diff)
Ajouté par Frédéric Péters il y a presque 7 ans

jsonresponse: remove serializer_type & wrap_response options (#17175)

Révision 0c087457 (diff)
Ajouté par Frédéric Péters il y a presque 7 ans

jsonresponse: remove unmaintained doctests (#17175)

Révision 5a43433e (diff)
Ajouté par Frédéric Péters il y a presque 7 ans

jsonresponse: remove unused serializers from to_json decorator (#17175)

Révision 8876acbe (diff)
Ajouté par Frédéric Péters il y a presque 7 ans

jsonresponse: simplify decorator wrapper (#17175)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Description mis à jour (diff)
#2

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Description mis à jour (diff)
#3

Mis à jour par Frédéric Péters il y a presque 7 ans

Vraiment réalisé à fin de validation de l'idée après avoir écrit le ticket, le patch qui bascule sur json-api et wrap_response à False.

Seul problème rencontré l'endpoint 'search' du connecteur "base adresse", qui a été prévu pour retourner une liste (et json-api fait un data.get('err', 0)), c'est en rapport avec l'ajout d'un entête x-error-code, ça pourrait être squeezé étant donné que de toute façon cet endpoint est fait pour suivre le format de nominatim. (mais en attendant j'ai juste mis serializer_type='json' à celui-là seul).

Si on s'accorde sur ce ticket, le vrai patch, il retirera complètement les paramètres serializer_type et wrap_response.

Bref, on se trouve à devoir ajouter des {'data': à plein d'endroits mais ce n'est pas pire qu'ajouter serializer_type='json-api' à ces endroits, et ça fait un modèle très simple à comprendre/document où ce qui est retourné c'est ce qu'on reçoit dans le navigateur, sans altération.

#4

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Lié à Development #17169: json data store : passer en mode json-api {err:0, data:...} ajouté
#5

Mis à jour par Frédéric Péters il y a presque 7 ans

Seul problème rencontré l'endpoint 'search' du connecteur "base adresse", qui a été prévu pour retourner une liste (et json-api fait un data.get('err', 0)), c'est en rapport avec l'ajout d'un entête x-error-code, ça pourrait être squeezé étant donné que de toute façon cet endpoint est fait pour suivre le format de nominatim. (mais en attendant j'ai juste mis serializer_type='json' à celui-là seul).

Après #16856, c'est ok.

Et imaginant le nettoyage, retirer les doctests pas maintenus, c'est 225 lignes en moins. Et retirer le choix de type de sérialisation (i.e. forcer json-api et wrap_response=False), c'est ~70 lignes de gagnées.

À titre indicatif, https://git.entrouvert.org/passerelle.git/log/?h=wip/unify-serializer-type

#6

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

Je trouve ça très bien. Je ne suis toujours pas fan du comportement par défaut pour l'exception ObjectDoesNotExist, toujours l'impression qu'on y perd plus (traitement par dessus la jambe des exceptions) que ce qu'on y gagne (pas de trace, juste une 404).

#7

Mis à jour par Frédéric Péters il y a presque 7 ans

Je trouve ça très bien. Je ne suis toujours pas fan du comportement par défaut pour l'exception ObjectDoesNotExist, toujours l'impression qu'on y perd plus (traitement par dessus la jambe des exceptions) que ce qu'on y gagne (pas de trace, juste une 404).

Ça me va très bien d'ensuite faire évoluer les comportements.

#8

Mis à jour par Thomas Noël il y a presque 7 ans

wip/unify-serializer-type me semble vraiment très bien également (et effectivement, ObjectDoesNotExist, à revoir)

#10

Mis à jour par Thomas Noël il y a presque 7 ans

Ack

#11

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 8876acbec567ff5362dbc67ff0a1ce9e41de23cc
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun Jun 25 11:14:03 2017 +0200

    jsonresponse: simplify decorator wrapper (#17175)

commit 5a43433e6799bba46bd33aa541e3a5a2f272b593
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sat Jun 24 23:57:53 2017 +0200

    jsonresponse: remove unused serializers from to_json decorator (#17175)

commit 0c0874576bd1893ddc0118609177ab2c20abd7b5
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sat Jun 24 23:50:54 2017 +0200

    jsonresponse: remove unmaintained doctests (#17175)

commit 46549bd81c4592469159df24e84ddad13802eb1a
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sat Jun 24 23:49:03 2017 +0200

    jsonresponse: remove serializer_type & wrap_response options (#17175)

commit 2eeeeb747c37505b2805cedaa42862cad3b0ea8c
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sat Jun 24 19:56:26 2017 +0200

    general: switch to json-api/wrap_response:False as endpoint default (#17175)
#12

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF