2010-11-19 4 views
1

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 ....

Répondre

0

Vous pouvez toujours envoyer le xml comme une chaîne et visser les bibliothèques. Non recommandé mais dans certains cas c'est plus facile.

ne pas oublier la Header("SoapAction: ...")

+0

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

+0

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

+0

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

1

Pas exactement une réponse à la question - mais il est maintenant résolu. Le fournisseur de services a créé une nouvelle méthode, identique à tous les égards, sauf qu'elle permettait d'utiliser un document XML plutôt qu'une chaîne. En modifiant légèrement le contenu de la variable $ bodyxml et en l'envoyant à cette nouvelle méthode, il semble fonctionner correctement. À propos, tous ceux qui cherchent à déboguer des applications SOAP devraient vraiment chercher à récupérer l'interface SOAP de Sourceforge. Cela m'a vraiment aidé à vérifier mon problème, et fourni quelques conseils utiles pour le correctif.

3

-Essayer this-

$xml = simplexml_load_string('<data>x</data>') 

puis (nusoap)

$result = $client->call('host', array('parameter' =>$xml) 
Questions connexes