Development #60836
connecteur SOAP générique
0%
Description
Cf. ticket un peu con #59868 où un connecteur est produit pour appeler une seule méthode SOAP qui en gros fait un GET et renvoie une liste de dico.
L'idée serait un connecteur SOAP générique où on désigne un WSDL et on obtient un endpoint "method" qui reçoit un seul paramètre dans l'URL, le nom de la méthode, appelle cette méthode et convertit la sérialisation du XML en objets zeep vers du JSON (pas trop compliqué normalement, possible que zeep fournisse déjà une méthode to_dict pour ela).
Point bonus : produire une description des méthodes disponibles dans l'interface, voir du JSON produit par chacune.
Fichiers
Révisions associées
misc: search endpoints on model not on the instance (#60836)
Instance have property descriptors which can fail on a getattr(), raising errors
during getmembers(), by iterating on the class we work around that.
add a generic soap connector (#60836)
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
- Patch proposed changé de Non à Oui
wip, le cas du ticket lié est déjà couvert directement sans développement.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
- Statut changé de Nouveau à Solution proposée
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Mis à jour par Nicolas Roche il y a plus de 2 ans
wip, le cas du ticket lié est déjà couvert directement sans développement.
Magique !
J'ai l'impression que json_schema_response
n'est pas pris en compte.
(pour retourner le format canonique avec {'err':, 'data':})
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
getTruc
et createTruc
on peut faire :
- juste GET
/soap/service1/method/getTruc/
pour obtenir un référentiel - ou bien GET
/soap/service1/method/getTruc/?query=machin
si getTruc accepte un paramètre query qui peut être une liste ou une simple chaîne (unElement<type=xs:string max_occurs=1 ou unbounded>
) - un POST sur
/soap/service1/method/createTruc?name=machin&email=machin@example.com
si createTruc prend deux paramètre name et machin - ou bien un POST
/soap/service1/method/createTruc
avec un payload JSON{'name': 'machin', 'email': 'machin@example.com'}
Et ça utilise aussi unflatten sur le POST JSON, donc on peut aussi faire un POST de {'Truc/Name': 'machin', 'Truc/Email': 'machin@example.com'}
si l'API SOAP exige une structure XML de la forme Truc(Name=..., Email=...)
.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
Possible, j'ai ajouté le conteneur explicite {'err': 0, 'data': ..}
en fin de méthode method
.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
Et une petite amélioration au schéma en sortie (l'élément racine est ignoré).
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
Et les tests.
Mis à jour par Nicolas Roche il y a environ 2 ans
Déjà je vois ça :
- crash si en face on a un mauvais certificat (et que l'on a pas coché l'option pour l'ignorer)
File "/home/nroche/src/passerelle/passerelle/utils/soap.py", line 87, in _load_remote_data raise SOAPError(
- crash sur un mauvais wsdl
File "/home/nroche/src/passerelle/passerelle/apps/soap/models.py", line 139, in operations_and_schemas operations = self.client.service._binding._operations File "/home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/zeep/client.py", line 100, in service raise ValueError( ValueError: There is no default service defined. This is usually due to missing wsdl:service definitions in the WSDL
- il manque l'authentification du client
return self.soap_client( wsdl_url=self.wsdl_url, ++ wsse=UsernameToken(self.basic_auth_username, self.basic_auth_password), ...
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
- Statut changé de Solution proposée à En cours
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
- Fichier 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch ajouté
- Fichier 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch ajouté
- Fichier 0002-wip-add-test-of-homepage-get_endpoint_infos.patch 0002-wip-add-test-of-homepage-get_endpoint_infos.patch ajouté
- Fichier 0006-wip-add-wsse-UsernameToken-support.patch 0006-wip-add-wsse-UsernameToken-support.patch ajouté
- Fichier 0004-misc-factorize-setting-of-the-availability-status.patch 0004-misc-factorize-setting-of-the-availability-status.patch ajouté
- Fichier 0003-wip-add-more-test-around-jsonify.patch 0003-wip-add-more-test-around-jsonify.patch ajouté
Voilà branche à jour avec les améliorations demandées.
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
- Fichier 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch ajouté
- Fichier 0009-wip-report-xsd-type-in-json-schema.patch 0009-wip-report-xsd-type-in-json-schema.patch ajouté
- Fichier 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch ajouté
- Fichier 0002-wip-add-test-of-homepage-get_endpoint_infos.patch 0002-wip-add-test-of-homepage-get_endpoint_infos.patch ajouté
- Fichier 0006-wip-add-wsse-UsernameToken-support.patch 0006-wip-add-wsse-UsernameToken-support.patch ajouté
- Fichier 0004-misc-factorize-setting-of-the-availability-status.patch 0004-misc-factorize-setting-of-the-availability-status.patch ajouté
- Fichier 0008-wip-convert-soap-Fault-to-json.patch 0008-wip-convert-soap-Fault-to-json.patch ajouté
- Fichier 0003-wip-add-more-test-around-jsonify.patch 0003-wip-add-more-test-around-jsonify.patch ajouté
- Statut changé de En cours à Solution proposée
Encore quelques améliorations.
Mis à jour par Nicolas Roche il y a environ 2 ans
C'est vraiment top, et je suis pressé de l'avoir en recette !
Dans 0005 tu as embarqué une correction de 0004 concernant passerelle/base/models.py.
Aussi, je n'ai pas compris l'impact de la modif sur inspect.getmembers pour récupérer les infos sur les endpoints, où plutôt que de récupérer les méthodes sur un objet, on récupère les fonctions sur les classes.
Je la verrais bien dans un commit séparé histoire d'avoir une petite explication dans son intitulé.
0006: c'est bizarre d'avoir le mot de passe pour l'authentification basique relayé plus bas. J'aurais mis :
fields[:4] + fields[-5:] + fields[4:-5]
Peut-être merger 0007 et 0009 ?
Enfin, j'aurais laissé les WS qui n'ont pas d'arguments en GET, histoire que d'un unique coup d’œil (parce que c'est bleu) on sache que l'on puisse cliquer dessus pour obtenir directement des résultats :
<<< if input_schema: endpoints[-1].http_method = 'post' --- if input_schema and input_schema.get('type') != 'null': >>>
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
Nicolas Roche a écrit :
C'est vraiment top, et je suis pressé de l'avoir en recette !
Dans 0005 tu as embarqué une correction de 0004 concernant passerelle/base/models.py.
Oui je l'ai remis dans le bon commit, mais tout ce qui est wip va être rebasé dans le premier commit.
Aussi, je n'ai pas compris l'impact de la modif sur inspect.getmembers pour récupérer les infos sur les endpoints, où plutôt que de récupérer les méthodes sur un objet, on récupère les fonctions sur les classes.
Je la verrais bien dans un commit séparé histoire d'avoir une petite explication dans son intitulé.
C'est fait, le problème vient de la propriété operations_and_schemas, inspect.getmembers() fait un getattr au lieu de hasattr ce qui provoque une éventuelle erreur SOAPError et plante la recherche des endpoints, comme les endpoints sont en fait toujours défini sur la classe, c'est sur la classe qu'il faut faire getmembers() pour éviter ça (ça pourrait revenir à tout moment dès qu'on crée un property sur un modèle).
0006: c'est bizarre d'avoir le mot de passe pour l'authentification basique relayé plus bas. J'aurais mis :
[...]
Non je suis pas fan, l'auth basic est un détail et jusqu'à présent c'est rare qu'il y en ait.
Peut-être merger 0007 et 0009 ?
Comme dit plus haut, tout vas être mergé, sauf les misc:*.
Enfin, j'aurais laissé les WS qui n'ont pas d'arguments en GET, histoire que d'un unique coup d’œil (parce que c'est bleu) on sache que l'on puisse cliquer dessus pour obtenir directement des résultats :
[...]
Ok.
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
- Fichier 0001-add-a-generic-soap-connector-60836.patch 0001-add-a-generic-soap-connector-60836.patch ajouté
- Fichier 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch ajouté
- Fichier 0007-wip-add-wsse-UsernameToken-support.patch 0007-wip-add-wsse-UsernameToken-support.patch ajouté
- Fichier 0010-wip-report-xsd-type-in-json-schema.patch 0010-wip-report-xsd-type-in-json-schema.patch ajouté
- Fichier 0008-wip-report-xsd-type-name-in-json-schema-for-debug.patch 0008-wip-report-xsd-type-name-in-json-schema-for-debug.patch ajouté
- Fichier 0002-wip-add-test-of-homepage-get_endpoint_infos.patch 0002-wip-add-test-of-homepage-get_endpoint_infos.patch ajouté
- Fichier 0004-misc-factorize-setting-of-the-availability-status.patch 0004-misc-factorize-setting-of-the-availability-status.patch ajouté
- Fichier 0009-wip-convert-soap-Fault-to-json.patch 0009-wip-convert-soap-Fault-to-json.patch ajouté
- Fichier 0003-wip-add-more-test-around-jsonify.patch 0003-wip-add-more-test-around-jsonify.patch ajouté
- Fichier 0006-misc-search-endpoints-on-model-not-on-the-instance.patch 0006-misc-search-endpoints-on-model-not-on-the-instance.patch ajouté
- Fichier 0011-wip-check-properties-to-decide-between-get-post-endp.patch 0011-wip-check-properties-to-decide-between-get-post-endp.patch ajouté
Mis à jour par Nicolas Roche il y a environ 2 ans
- Fichier Screenshot_2022-03-25 Passerelle.png Screenshot_2022-03-25 Passerelle.png ajouté
- Statut changé de Solution proposée à Solution validée
Tout bon pour moi.
Je pose quand même cette capture d'écran pour préciser ce que j'entendais pas "le mot de passe pour l'authentification basique relayé plus bas" (donc j'aurais mis fields[:2] + fields[-5:] + fields[2:-5] pour déplacer le login et le mot de passe sans les séparer)
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
Rebasage sur le travail de Laureline, je vais regarder pour l'ordre des champs (le nombre de champs diffèrent, plus de slug, entre le formulaire de création et celui d'édition ça explique le souci).
Mis à jour par Benjamin Dauvergne il y a environ 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 1f748deb73e152b34f6e1250662c70a9604ba318 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Wed Jan 19 16:52:48 2022 +0100 add a generic soap connector (#60836) commit 498813542f11f3f65bf326bec8387e67d8b0e16c Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Mar 25 12:11:25 2022 +0100 misc: search endpoints on model not on the instance (#60836) Instance have property descriptors which can fail on a getattr(), raising errors during getmembers(), by iterating on the class we work around that. commit 1c5c7e545467bfd052cb18f3cf327d223731253d Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Wed Mar 23 07:12:00 2022 +0100 misc: factorize setting of the availability status (#60836)
Mis à jour par Transition automatique il y a environ 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
misc: factorize setting of the availability status (#60836)