La MOUSSE de programmation d'accès à des méthodes et des types
Je suis enquêter sur la MOUSSE de SAVON client pour python. Je veux inspecter les méthodes disponibles à partir d'un service spécifique, et les types requis par une méthode spécifiée.
L'objectif est de générer une interface utilisateur, permettant aux utilisateurs de sélectionner une méthode, puis remplissez les valeurs dans un générées dynamiquement en forme.
Je peux obtenir des informations sur une méthode particulière, mais je suis pas sûr de la façon de l'analyser:
client = Client(url)
method = client.sd.service.methods['MyMethod']
Je suis incapable de programmaticaly comprendre à quel type d'objet j'ai besoin de créer pour être en mesure d'appeler le service
obj = client.factory.create('?')
res = client.service.MyMethod(obj, soapheaders=authen)
Quelqu'un aurait-il un exemple de code?
Vous devez vous connecter pour publier un commentaire.
D'accord, de sorte que la MOUSSE n'est tout à fait un peu de magie.
Un
suds.client.Client
, est construit à partir d'un fichier WSDL:Il télécharge le fichier WSDL, et crée une définition dans
client.wsdl
. Lorsque vous appelez une méthode à l'aide de la MOUSSE parclient.service.<method>
il est en train de faire tout un tas de récursive résoudre la magie derrière les coulisses contre cette interprété WSDL. Pour découvrir les paramètres et les types de méthodes que vous aurez besoin de connaître le fonctionnement de cet objet.Par exemple:
Cela devrait afficher quelque chose comme:
Ainsi, le premier élément de la partie de type tuple est probablement ce que vous recherchez:
Mise à jour:
Pour le service Météorologique il semble que les "paramètres" sont une partie avec un
element
pas untype
:Mais c'est de la magie avait dans les paramètres de l'appel de méthode (à la
client.service.GetWeatherByZipCode("12345")
. Autant que je me souvienne c'est le SAVON de liaison RPC style? Je pense qu'il y a suffisamment d'informations pour vous aider à démarrer. Astuce: le Python interface de ligne de commande est votre ami!Selon
suds
la documentation, vous pouvez inspecterservice
objet avec__str()__
. Donc la suite obtient une liste des méthodes et des types complexes:Le code ci-dessus produit le résultat suivant (contenu de
temp
):Ce serait beaucoup plus facile à analyser. Aussi, chaque méthode est répertorié avec leurs paramètres ainsi que leurs types. Vous pouvez, sans doute, même d'utiliser la juste expression régulière pour extraire l'information dont vous avez besoin.
Voici un petit script que j'ai écrit basé sur les informations ci-dessus pour la liste des méthodes de saisie de la mousse de rapports disponibles sur un document WSDL. Passer dans l'URL du WSDL. Travaux pour le projet sur lequel je suis actuellement, je ne peux pas le garantir pour le vôtre.
Vous pouvez accéder à la mousse de ServiceDefinition objet. Voici un petit échantillon:
Maintenant, si vous voulez connaître le préfixe de nom d'un type, il est également très facile:
Ce double support de la notation est parce que les types sont d'une liste (d'où une première [0]), puis dans chaque élément de cette liste, il peut y avoir deux éléments. Cependant, la mousse interne de la mise en œuvre de
__unicode__
est exactement ce que fait (c'est à dire ne prend que le premier élément de la liste):Heureux de codage 😉
Une fois que vous avez créé WSDL méthode de l'objet vous pouvez obtenir des informations à ce sujet, il est
__metadata__
, y compris la liste des arguments du nom.Compte tenu de l'argument du nom, vous pouvez y accéder à l'instance réelle de la méthode créée. Cette instance en contient également de l'information dans
__metadata__
, là, vous pouvez obtenir ce genre de nom deAvertissement: ceci ne fonctionne qu'avec WSDL complexe types. Les types simples, comme les chaînes et les nombres, sont, par défaut, Aucun