#!⌨

L'ordre des paramètres dans SOAPpy

SOAPpy est une bibliothèque très pratique qui permet d'écrire un serveur ou un client SOAP très rapidement. Les exemples sont d'une simplicité déconcertante...

En ce qui me concerne, je l'utilise souvent comme librairie cliente pour me connecter à des services SOAP divers et variés. Mais aujourd'hui, mon problème est l'appel à des webservices écrit en Java avec Apache CXF. Par exemple, voilà comment appeler une fonction avec des arguments nommés :

import SOAPpy

client = SOAPpy.SOAPProxy('http://host/service')
client.fonction(argument1='test', argument2='test2')

Dans ce cas, côté serveur Java, j'ai null comme valeur pour argument1. Après quelques investigations, dump de trames réseaux, tests avec curl, je me rends compte que l'ordre des paramètres de ma fonction est important. Les paramètres sont nommés, mais cela ne suffit pas...

Les paramètres nommés doivent être dans le même ordre celui dans lequel ils ont été déclarés dans la classe Java. Je ne sais pas ce que dit la spécification, mais de mon point de vue, à partir du moment où les arguments sont nommés, l'ordre n'importe plus. Mais bon, je veux juste que mon script fonctionne correctement...

Il y a une solution dans SOAPpy qui est un peu cachée. Il suffit de définir l'ordre des paramètres nommés à la création du webservice :

import SOAPpy

config = SOAPpy.SOAPConfig()
config.argsOrdering = {
  'fonction': ['argument1', 'argument2'],
}

client = SOAPpy.SOAPProxy('http://host/service', config=config)
client.fonction(argument1='test', argument2='test2')

La différence est qu'on spécifie une configuration au proxy SOAP. Cette configuration a un attribut argsOrdering qui doit être un dictionnaire dont les clefs sont les noms des méthodes, et les valeurs, des listes ordonnées des noms des paramètres.

Et voilà ! Plus de problème : mes paramètres sont bien dans le bon ordre et avec les bons noms, et le serveur Java les récupère sans problème !