2009-05-01 10 views
6

No tengo relativamente experiencia con SOAP. Estoy tratando de trabajar con un servicio web para un cliente que usa el modo WSDL. Tengo problemas para pasar los parámetros con el método y hacer que aparezcan los parámetros que aparecen en la solicitud según sea necesario. Estoy usando la clase estándar de jabón php.Parámetros del método PHP-Soap Pass

necesito mi solicitud SOAP a estructurarse como la siguiente:

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

en PHP que llama a la función de este modo:

$client->DoLogin($args); 

Y la solicitud termina así:

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

No importa cómo paso los argumentos (objetos únicos, matriz, objeto de clase) No puedo obtener la solicitud para tener la estructura como eso.

¿Alguien me puede ayudar? Estoy seguro de que va a ser algo bastante simple.

+0

¿Has encontrado una respuesta? – darpet

Respuesta

-3

probar esto,

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

Mientras trabajaba en un problema ligeramente relacionado hoy en día, me encontré con que el siguiente PHP produjo la solicitud SOAP se muestra a continuación:

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

Un retén Descubrí que si los parámetros ($ params) que aprobé no se ajustaban a lo que se especificaba en el archivo WSDL, el mensaje de que el cliente SOAP Nerated se vería similar a lo que usted se queja: un mensaje con un cuerpo no contiene ningún valor de datos. Me pregunto si tu problema está aquí.

Además, tenga en cuenta cómo el PHP anterior utiliza dos matrices para pasar parámetros. La primera matriz contiene los parámetros y sus nombres. El segundo contiene el primer conjunto. Interesante sintaxis, lo sé. :-)

Para su información, el código de ejemplo anterior se utiliza para comunicarse con un servicio C# .NET WCF tiene la siguiente contrato:

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

Perdón por comentar un hilo antiguo, pero este lanzamiento '$ params' como una matriz al hacer la llamada a la función funcionó para mí. Gracias Ben. – etm124

+0

En realidad, puedes pasar una matriz de matriz: array ($ params) y funcionará igual. – nikita2206

+0

Salvaste mi vida en este momento Ben Gribaudo :) $ sc-> FuncName (array ("param" => "valor)) está pasando los parámetros como se esperaba, pero $ sc -> __ soapCall (" FuncName ", array (" param "= > "valor") no está pasando ningún parámetro. Ponga los parámetros en la matriz ("parámetros" => $ parámetros), hizo el truco. Muchas gracias amigo. – sajushko

3

intente esto:

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

que trabajó para mí con un servicio web .NET.

0

Tuve el mismo problema.

Ésta resuelto para mí:

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

tipos de parámetros (y fin) debe ser el mismo que lo que define el WSDL actual. (Cadena, objeto, etc)

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

mi pregunta es que usted ha dicho

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

por encima de código para los servicios web .NET, pero cuando he intentado este método para.net asp servicios web, los valores de los parámetros no se analizan, creo que sí, porque cuando eliminé params = valor no se aplica el mismo "¡Error desconocido!" de los servicios web asp .net en iframe.

Cuestiones relacionadas