Je suis nouveau à SOAP et j'ai des problèmes (oui, j'ai beaucoup cherché, mais je ne peux pas sembler correspondre à mon exigence simple - l'envoi d'une chaîne XML simple) avec l'envoi d'une sortie vers un serveur .NET pour correspondre à ceci:Envoi d'une chaîne XML (pas tableau) depuis le service PHP SOAP ou nusoap vers .NET
POST /someurl.asmx HTTP/1.1
Host: www.somehost.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://somehost.com/SubmitCalls"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SubmitCalls xmlns="http://somehost/">
<request>string</request>
</SubmitCalls>
</soap:Body>
</soap:Envelope>
Mon code nusoap ressemble à ceci:
<?php
require_once('../lib/nusoap.php');
$bodyxml = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SubmitCalls xmlns="http://somehost/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<request>
<?xml version="1.0" encoding="UTF-8"?>
<bXML xmlns="http://somehost/Schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<From>
<UserName>some username</UserName>
<Password>some password</Password>
</From>
<Calls>
<Call>
<Reference>11111</Reference>
<Name>Joe Bloggs</Name>
<Tel1>02075574200</Tel1>
<Tel2>02075574201</Tel2>
<Tel3>02075574202</Tel3>
<Tel4>02075574203</Tel4>
<Tel5>02075574204</Tel5>
<CLI>08448220640</CLI>
<CallTime>09:00</CallTime>
<FileName>02075574200_1</FileName>
</Call>
<Call>
<Reference>11111</Reference>
<Name>Joe Bloggs</Name>
<Tel1>02075574200</Tel1>
<Tel2>02075574206</Tel2>
<Tel3>02075574207</Tel3>
<Tel4>02075574208</Tel4>
<Tel5>02075574209</Tel5>
<CLI>08448220640</CLI>
<CallTime>09:00</CallTime>
<FileName>02075574200_2</FileName>
</Call>
</Calls>
</bXML>
</request>
</SubmitCalls>
</soap:Body>
</soap:Envelope>
';
$client = new nusoap_client("somehost?WSDL",true);
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
exit();
}
$client->soap_defencoding = 'utf-8';
$client->useHTTPPersistentConnection();
$client->setUseCurl($useCURL);
$bsoapaction = "http://somehost/SubmitCalls";
$result = $client->send($bodyxml, $bsoapaction);
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Client Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
echo '<h2>Proxy Debug</h2><pre>' . htmlspecialchars($proxy->debug_str, ENT_QUOTES) . '</pre>';
?>
(obiously, tous les somehost et les noms d'utilisateur sont corrects dans le script final). Je peux me connecter au WSDL, lisez-le, il n'y a qu'une seule méthode qui m'intéresse (SubmitCalls) qui n'a qu'une partie, nommée 'parameters' dans le schéma WSDL. Ce qui précède jette une erreur de demande 400 Bad - des idées où je vais mal?
J'ai essayé d'utiliser PHP SOAP à la place, mais je n'arrive tout simplement pas à envoyer une chaîne XML en tant que corps de la requête SOAP. J'ai tripoté ça pendant trois jours et j'ai lu un zillion de pages web, mais je n'arrive toujours pas à le faire correctement. S'il vous plaît aidez .... si vous pouviez me montrer comment faire ceci en utilisant n'importe quelle bibliothèque je serais énormément reconnaissant ....
L'en-tête SoapAction est défini par le deuxième paramètre de la fonction d'envoi, je pense (la var bapsapaction dans mon code). À moins que je ne me trompe ... – odeclas
Sérieusement, y a-t-il des indications à ce sujet? Comme il me semble générer 400 erreurs de requête Bad - qu'est-ce que cela signifie dans ce contexte? Cela signifie-t-il que l'information d'en-tête est fausse, ou l'encodage? Ou est-ce que je fais quelque chose avec la ficelle? – odeclas
J'ai essayé d'utiliser PHP SOAP et __doRequest en utilisant la requête $ qui fonctionne apparemment à partir d'un client .NET, et obtenant toujours un 400 .... – odeclas