2011-11-22 44 views
5

Estoy tratando de llamar a un servicio web remoto, dentro de mi empresa. Por razones de propiedad no puedo proporcionar la URL al servicio web. El servicio web tiene una única función llamada getItemField. Es un pequeño servicio de prueba que estoy tratando de ejecutar PHP en contra, la descripción del servicio es la siguiente:PHP y no encabezado de acción de Soap

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://www.oracle.com/ws/MyFirstWebService" xmlns:intf="http://www.oracle.com/ws/MyFirstWebService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://www.w3.org/1999/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.oracle.com/ws/MyFirstWebService"> 
<!-- 
WSDL created by Apache Axis version: 1.2alpha Built on Oct 23, 2007 (12:09:54 IST) 
--> 
<wsdl:types> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.oracle.com/ws/MyFirstWebService"> 
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
<complexType name="ArrayOf_xsd_string"> 
<complexContent> 
<restriction base="soapenc:Array"> 
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> 
</restriction> 
</complexContent> 
</complexType> 
</schema> 
</wsdl:types> 
<message name="getItemFieldRequest"> 
<part name="args" type="impl:ArrayOf_xsd_string"/> 
</message> 
<message name="getItemFieldResponse"> 
<part name="getItemFieldReturn" type="soapenc:string"/> 
</message> 
<portType name="MyFirstWebService"> 
<operation name="getItemField" parameterOrder="args"> 
<input message="impl:getItemFieldRequest" name="getItemFieldRequest"/> 
<output message="impl:getItemFieldResponse" name="getItemFieldResponse"/> 
</operation> 
</portType> 
<binding name="MyFirstWebServiceSoapBinding" type="impl:MyFirstWebService"> 
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
<operation name="getItemField"> 
<wsdlsoap:operation soapAction=""/> 
<input name="getItemFieldRequest"> 
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://first" use="encoded"/> 
</input> 
<output name="getItemFieldResponse"> 
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.oracle.com/ws/MyFirstWebService" use="encoded"/> 
</output> 
</operation> 
</binding> 
<service name="MyFirstWebServiceService"> 
<port binding="impl:MyFirstWebServiceSoapBinding" name="MyFirstWebService"> 
<wsdlsoap:address location="http://myWebsite.com/services/MyFirstWebService"/> 
</port> 
</service> 
</definitions> 

que puede conectar con el servicio muy bien e imprimir el nombre de la función y el tipo único, pero cuando intento llamar a una función obtengo '¡no hay encabezado de SOAPAction!' error. Mi código PHP para llamar a la función de servicio es el siguiente:

$options = array(
       // Dev 
       'soap_version'=>SOAP_1_2, 
       'exceptions'=>true, 
       'trace'=>1, 
       'cache_wsdl'=>WSDL_CACHE_NONE, 
       'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 

       // Credentials 
       'login' => 'user', 
       'password' => 'pass' 
      );   

// Connected successfully 
      $client = new SoapClient("http://myWebsite.com/services/MyFirstWebService?wsdl", $options); 

    //Params 
     $params = array('123456'); 

     //Options 
     $options = array('soapaction' => '""'); 

     //Call function (Both methods below throw the same 'no SOAPAction header!' error) 
     //$result = $client->getItemField(new SoapParam($params, "getItemFieldRequest")); 
     $result = $client->__soapCall("getItemField", array('123456'), $options); 

base a la descripción del servicio que no parecen tener un SOAPAction definido. La línea que veo con soapAction es <wsdlsoap:operation soapAction=""/>. Traté de especificar una acción en blanco porque no había ninguna definida, pero eso no parecía funcionar. ¿La definición del servicio web en sí es incompleta? ¿O me falta algún parámetro en mi llamada a la aplicación del lado del cliente? Gracias por adelantado.

ACTUALIZACIÓN:

intentado especificar el nombre del método como la acción de jabón, pero Htat no funcionó.

//Params 
    $params = array('123456'); 

    //Options 
    $options = array('soapaction' => 'getItemField'); 

    //Call function (STILL THROWS 'no SOAPAction header!') 
    $result = $client->__soapCall("getItemField", $params, $options); 

¿Qué se supone que debe hacer si no se especifica ningún soapAction en el WSDL, es decir, si está ajustado en "".

+0

¿Alguna actualización sobre eso? Me enfrento al mismo problema cuando trato de conectarme a través de curl en un servicio web al que me puedo conectar a través de Zend soap, así que supongo que está relacionado con algunas opciones o encabezados. –

+0

¿El encabezado SOAPAction no está relacionado con el encabezado HTTP? Compruebe http://www.oreillynet.com/xml/blog/2002/11/unraveling_the_mystery_of_soap.html – pedromanoel

Respuesta

-1

Su difícil ayudar sin tener todos los detalles necesarios, pero voy a aconsejar que pruebe lo siguiente:

//Replace accordingly: see PHP Manual 
//(http://www.php.net/manual/en/soapheader.soapheader.php) 

$header = new SoapHeader($namespace, $name, $data, $mustunderstand, $actor); 
$client->__setSoapHeaders($header); 

//Main soap call follows.... 

antes de hacer la llamada al servicio de jabón. Espero que esto ayude.

+0

¿Por qué el voto a favor? Es realmente grosero tanto para @profnotime como para todos los que vienen aquí en busca de una respuesta ... – pedromanoel

+0

SoapHeader es para rellenar la sección de la solicitud SOAP. No establece un encabezado HTTP. – Andrew

2

Tuve un problema similar, pero estaba usando cURL y no el SoapClient, aunque la solución puede ser la misma.

Al enviar una solicitud al servicio final, debe enviar un encabezado que especifique el Content-Type. En este encabezado, también puede especificar action, o "acción de jabón".

$headers = array(); 
$headers[] = 'Content-Type: application/soap+xml; charset=utf-8; action="[soap action goes here]"'; 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

En mi caso, y lo que parece ser el mismo que el suyo, el WSDL enumera los siguientes:

<wsdl:operation name="getProducts"> 
    <soap:operation soapAction=""/> 
    <!-- trimmed --> 
</wsdl:operation> 

En un primer momento, veo soapAction="", por lo que establece action="" en las cabeceras que se envían . Esto falló La información correcta que se incluye en el encabezado es operation, por lo que es action="getProducts".

Con base en el manual de SoapClient y la respuesta a php using SOAP with a different SoapAction, su solicitud debería haber trabajado con:

$client = new SoapClient("http://myWebsite.com/services/MyFirstWebService?wsdl", $options); 
$result = $client->__soapCall("getItemField", array('123456')); 

¿Alguna vez omite el $options enviado a __soapCall() que simplemente no especificar una acción (en lugar de pasar en uno en blanco)?

Cuestiones relacionadas