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 "".
¿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. –
¿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