2009-11-24 6 views
3

J'essaie d'envoyer une requête SOAP à un service de newsletter en utilisant this WSDL.PHP SoapClient request

Voici mon PHP:

$client = new SoapClient($wsdl_url, array(
    'login' => 'myusername', 
    'password' => 'mypassword', 
    'trace' => true 
)); 

$client->AddSubscriber(
    new SoapParam('MyFirstName', 'FirstName'), 
    new SoapParam('MyLastName', 'LastName'), 
    new SoapParam('[email protected]', 'Email') 
); 

Je reçois l'exception:

End element 'Body' from namespace 'schemas.xmlsoap.org/soap/envelope/' expected. Found element 'LastName' from namespace ''. Line 2, position 156. 

Voici ce que le service attend pour AddSubscriber:

<?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="schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    <AuthHeader xmlns="admin.ekeryx.com"> 
     <Username>string</Username> 
     <Password>string</Password> 
     <AccountID>string</AccountID> 
    </AuthHeader> 
    </soap:Header> 
    <soap:Body> 
    <AddSubscriber xmlns="admin.ekeryx.com"> 
     <subscriber> 
     <ID>string</ID> 
     <FirstName>string</FirstName> 
     <LastName>string</LastName> 
     <Email>string</Email> 
     </subscriber> 
     <overwritable>boolean</overwritable> 
    </AddSubscriber> 
    </soap:Body> 
</soap:Envelope> 

Voici ce qui est envoyé:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="tempuri.org/"> 
    <SOAP-ENV:Body> 
     <ns1:AddSubscriber/> 
      <LastName>MyLastName</LastName> 
      <Email>[email protected]</Email> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Je ne suis pas très familier avec SOAP, et j'ai cherché de la documentation partout, mais je n'arrive pas à trouver une très bonne référence pour ce que je fais.

Toute guidance serait grandement appréciée!


Merci. Pourriez-vous me donner un exemple? Je regarde l'exemple sur le site PHP qui montre:

<?php 
class SOAPStruct { 
    function SOAPStruct($s, $i, $f) 
    { 
     $this->varString = $s; 
     $this->varInt = $i; 
     $this->varFloat = $f; 
    } 
} 
$client = new SoapClient(null, array('location' => "http://localhost/soap.php", 
            'uri'  => "http://test-uri/")); 
$struct = new SOAPStruct('arg', 34, 325.325); 
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd"); 
$client->echoStruct(new SoapParam($soapstruct, "inputStruct")); 
?> 

Voulez-vous dire que je dois créer une classe PHP d'abonné, attribuer tous les vars $this->FirstName = $first_name, etc ... et puis le mettre dans un SoapVar avec l'encodage SOAP_ENC_OBJECT? Comment puis-je mieux représenter la structure de l'abonné?

+0

S'il vous plaît noter , J'ai supprimé le http: // de toutes les URL dans le code afin de respecter le maximum de 1 lien hypertexte par règle de publication. –

Répondre

3

Il y a deux abonnés Params possibles et overwriteable

<soap:Body> 
<AddSubscriber xmlns="admin.ekeryx.com"> 
    <subscriber> 
    <ID>string</ID> 
    <FirstName>string</FirstName> 
    <LastName>string</LastName> 
    <Email>string</Email> 
    </subscriber> 
    <overwritable>boolean</overwritable> 
</AddSubscriber> 

Vous devez faire une construction plus complexe en utilisant SoapVar pour représenter la structure subsrciber.

http://www.php.net/manual/en/soapvar.soapvar.php

devrait ressembler à quelque chose comme ça, je pense, même si vous aurez envie de vérifier la XSD contre le savon: corps produit ...

$subscriber = new StdClass(); 
$subscriber->ID = 'myid'; 
$subscriber->FirstName = 'First'; 
$subscriber->LastName = 'Last'; 

$subscriber = new SoapParam(new SoapVar($subscriber, SOAP_ENC_OBJECT, $type, $xsd), 'subscriber'); 

$ type devrait être le type dans le XSD/La défnition WSDL pour l'API et $ xsd est l'URI pour le XSD.

Je pense que cela devrait être le cas mais je n'ai utilisé que des libs natives PHP une fois pour EBay (c'était un haha ​​de cauchemar) et cela faisait presque 2 ans donc je suis un peu rouillé.

0

Je suis tombé dessus en cherchant une réponse similaire moi-même. Je crois que le problème que vous rencontrez est que le code suivant passera le login et le mot de passe dans l'en-tête HTTP pas l'en-tête SOAP

$client = new SoapClient($wsdl_url, array(
    'login' => 'myusername', 
    'password' => 'mypassword', 
    'trace' => true 
)); 

Je crois que c'est ce que vous cherchez

$headerbody = array('Token' => $someToken, 
        'Version' => $someVersion, 
        'MerchantID'=>$someMerchantId, 
         'UserCredentials'=>array('UserID'=>$UserID, 
              'Password'=>$Pwd)); 
Questions connexes