J'ai l'habitude d'écrire du code PHP, mais n'utilise pas souvent le codage orienté objet. Je dois maintenant interagir avec SOAP (en tant que client) et je ne parviens pas à obtenir la bonne syntaxe. J'ai un fichier WSDL qui me permet de configurer correctement une nouvelle connexion à l'aide de la classe SoapClient. Cependant, je ne suis pas en mesure de passer le bon appel et de récupérer les données. Je dois envoyer les données (simplifiées) suivantes:
- ID de contact
- Nom du contact
- Description générale
- Montant
Il y a deux fonctions définies dans le document WSDL, mais je n'en ai besoin que d'une ("FirstFunction" ci-dessous). Voici le script que j'exécute pour obtenir des informations sur les fonctions et les types disponibles:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
Et voici la sortie qu'il génère:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Dites que je veux appeler la FirstFunction avec les données:
- Identifiant du contact: 100
- Nom du contact: John
- Description générale: baril de pétrole
- Montant: 500
Quelle serait la bonne syntaxe? J'ai essayé toutes sortes d'options, mais il semble que la structure du savon soit assez flexible, il y a donc de très nombreuses façons de le faire. Impossible de le comprendre non plus dans le manuel ...
UPDATE 1: échantillon essayé de MMK:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Mais je reçois cette réponse: Object has no 'Contact' property
. Comme vous pouvez le voir dans la sortie de getTypes()
, il y a un struct
appelé Contact
, donc je suppose que je dois en quelque sorte préciser que mes paramètres incluent les données de contact, mais la question est: comment?
MISE À JOUR 2: J'ai également essayé ces structures, même erreur.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Aussi bien que:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Erreur dans les deux cas: l'objet n'a pas de propriété 'Contact' '
Vous pouvez également utiliser les services SOAP de cette façon:
Ceci est un exemple avec un vrai service, et ça marche.
J'espère que cela t'aides.
la source
Initialisez d'abord les services Web:
Ensuite, définissez et transmettez les paramètres:
Notez que le nom de la méthode est disponible dans WSDL comme nom d'opération, par exemple:
la source
Je ne sais pas pourquoi mon service Web a la même structure que vous, mais il n'a pas besoin de classe pour le paramètre, c'est juste un tableau.
Par exemple: - Mon WSDL:
Je var_dump:
Voici le résultat:
Donc dans mon code:
mais ça réussit!
la source
lis ça;-
http://php.net/manual/en/soapclient.call.php
Ou
Ceci est un bon exemple pour la fonction SOAP "__call". Cependant, il est obsolète.
la source
Tout d'abord, utilisez SoapUI pour créer votre projet soap à partir du fichier wsdl. Essayez d'envoyer une demande pour jouer avec les opérations du wsdl. Observez comment la requête xml compose vos champs de données.
Et puis, si vous rencontrez des problèmes pour que SoapClient agisse comme vous le souhaitez, voici comment je le débogue. Définissez l'option trace de sorte que la fonction __getLastRequest () soit disponible.
Ensuite, la variable $ xml contient le xml que SoapClient compose pour votre demande. Comparez ce xml avec celui généré dans SoapUI.
Pour moi, SoapClient semble ignorer les clés du tableau associatif $ params et l'interpréter comme un tableau indexé, provoquant des données de paramètres erronées dans le xml. Autrement dit, si je réorganise les données dans $ params , la réponse $ est complètement différente:
la source
Si vous créez l'objet de SoapParam, cela résoudra votre problème. Créez une classe et mappez-la avec le type d'objet donné par WebService, initialisez les valeurs et envoyez la requête. Voir l'exemple ci-dessous.
la source
J'ai eu le même problème, mais j'ai juste enveloppé les arguments comme celui-ci et cela fonctionne maintenant.
Utilisation de cette fonction:
Vous pouvez voir le XML de requête, qu'il change ou non en fonction de vos arguments.
Utilisez [trace = 1, exceptions = 0] dans les options SoapClient.
la source
Vous devez déclarer un contrat de classe
ou
ensuite
ou
la source
Vous avez besoin d'un tableau multidimensionnel, vous pouvez essayer ce qui suit:
en PHP, un tableau est une structure et est très flexible. Normalement, avec les appels soap, j'utilise un wrapper XML donc je ne sais pas si cela fonctionnera.
ÉDITER:
Ce que vous voudrez peut-être essayer est de créer une requête json à envoyer ou de l'utiliser pour créer une sorte d'achat xml en suivant ce qui se trouve sur cette page: http://onwebdev.blogspot.com/2011/08/php-converting-rss- to-json.html
la source
Il existe une option pour générer des objets php5 avec la classe WsdlInterpreter. En savoir plus ici: https://github.com/gkwelding/WSDLInterpreter
par exemple:
la source
getLastRequest ():
Cette méthode ne fonctionne que si l'objet SoapClient a été créé avec l'option de trace définie sur TRUE.
TRUE dans ce cas est représenté par 1
travaillé pour moi.
la source