2009-05-01 8 views
6

Nie mam stosunkowo żadnego doświadczenia z SOAP. Próbuję pracować z usługą sieciową dla klienta przy użyciu trybu WSDL. Mam problem z przekazaniem parametrów za pomocą metody i otrzymaniem parametrów, które pojawią się w żądaniu w razie potrzeby. Używam standardowej klasy mydła php.Parametry metody przesyłu Mydła PHP

muszę moją prośbę SOAP być skonstruowany tak:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"> 
    <SOAP-ENV:Body> 
     <ns1:DoLogin> 
      <ns1:request> 
       <ns1:Session> 
        <ns1:SessionId>00000000-0000-0000-0000-000000000000</ns1:SessionId> 
       </ns1:Session> 
       <ns1:UserCredential> 
        <ns1:UserName>username</ns1:UserName> 
        <ns1:Password>password</ns1:Password> 
        <ns1:ApplicationID>00000000-0000-0000-0000-000000000000</ns1:ApplicationID> 
        <ns1:ClientID>00000000-0000-0000-0000-000000000000</ns1:ClientID> 
        <ns1:ClientVersion>V1.0</ns1:ClientVersion> 
       </ns1:UserCredential> 
      </ns1:request> 
     </ns1:DoLogin> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

w PHP I wywołać funkcję tak:

$client->DoLogin($args); 

i żądanie kończy się tak:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"><SOAP-ENV:Body><ns1:DoLogin/></SOAP-ENV:Body></SOAP-ENV:Envelope> 

Bez względu na to, jak przechodzę przez args (pojedyncze warianty, tablica, obiekt klasy) Nie mogę uzyskać prośby o taka struktura.

Czy ktoś może mi pomóc? Jestem pewien, że będzie to coś bardzo prostego.

+0

Czy znalazłeś odpowiedź? – darpet

Odpowiedz

-3

spróbować,

$client->__soapCall('methodName',array('requestObj'=>$requestObj)); 
10

Pracując dzisiaj na lekko związanej problemu, okazało się, że po PHP produkowane żądanie SOAP pokazano poniżej:

$sc = new SoapClient($url); 
$params = array('step' => 'ShippingInfo', 'value' => "hello"); 
$result = $sc->__soapCall('runStep', array('parameters' => $params)); 
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> 
<SOAP-ENV:Body> 
    <ns1:runStep> 
    <ns1:step>ShippingInfo</ns1:step> 
    <ns1:value>hello</ns1:value> 
    </ns1:runStep> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

jeden haczyk Stwierdziłem, że jeśli parametry ($ params), które przeszedłem, nie są zgodne z tym, co określono w pliku WSDL, komunikat, że klient SOAP ge zdenerwowany wyglądałby podobnie do tego, na co się skarżysz - wiadomość z ciałem nie zawiera wartości danych. Zastanawiam się, czy twój problem leży tutaj.

Należy również zauważyć, że powyższy PHP używa dwóch tablic do przekazywania parametrów. Pierwsza tablica zawiera parametry i ich nazwy. Drugi zawiera pierwszą tablicę. Interesująca składnia, wiem. :-)

FYI, kod Powyższy przykład jest używany do komunikowania się z usługą C# .NET WCF mający następującą umowę:

[OperationContract] 
string runStep(string step, string value); 
+0

Przepraszamy za komentowanie starego wątku, ale ten casting '$ params' jako tablica podczas wywoływania funkcji zadziałał dla mnie. Dzięki Ben. – etm124

+0

Właściwie możesz po prostu przekazać tablicę array: array ($ params) i będzie działać tak samo. – nikita2206

+0

Uratowałeś mi teraz życie Ben Gribaudo :) $ sc-> FuncName (array ("param" => "value)) przekazuje parametry zgodnie z oczekiwaniami, ale $ sc -> __ soapCall (" FuncName ", array (" param "= > "value") nie przekazuje żadnego parametru, a parametry do tablicy ("parametry" => $ parametry) zrobiły lewę. – sajushko

3

spróbuj tego:

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray)); 

który pracował dla mnie z usługą .NET.

0

Miałem ten sam problem.

Ten rozwiązane dla mnie:

$result = $soapClient->somefunction(array( "param1" => "value1", "param2" => "value2" ));

typów parametrów (i kolejność) musi być takie samo jak to, co obecny WSDL definiuje. (String, obiekt, etc)

1
This is valid way: right mr.bgondy 
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2"); 

moje pytanie jest to, że powiedział

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray)); 

powyższy kod NET internetowych usług, ale kiedy próbowałem tej metody.net asp usługi sieciowe, wartości parametrów nie parsować myślę, że tak, ponieważ kiedy usunąłem params = wartość nie działa to samo "Wystąpił nieznany błąd!" z usług internetowych .net asp w iframe.