PHP et pas de Savon action d'en-tête
Je suis en train d'appeler un service web à distance, au sein de mon entreprise. Pour les raisons que j'ai ne peut pas fournir l'URL du service web. Le service web a une fonction unique appelée getItemField. C'est un petit test que j'essaie de l'exécuter PHP contre, la description du service est comme suit:
<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>
Je peux me connecter le service est très bien et imprimer le nom de la fonction et le type, mais quand j'essaie d'appeler une fonction-je obtenir " pas de SOAPAction en-tête de!' erreur. Mon code PHP pour appeler la fonction de service est comme suit:
$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 );
Basée sur la description du service, il ne semble pas avoir un soapaction défini. La ligne que je vois avec soapAction est <wsdlsoap:operation soapAction=""/>
. J'ai essayé de spécifier un vide soapAction car il n'y a rien de défini, mais cela ne semble pas fonctionner. Est la définition de service web lui-même incomplète? Ou alors j'ai loupé un certain nombre de paramètres dans mon application côté client appel? Merci à l'avance.
Mise à JOUR:
Essayé de préciser le nom de la méthode que le savon d'action, mais htat n'a pas fonctionné.
//Params
$params = array( '123456' );
//Options
$options = array( 'soapaction' => 'getItemField' );
//Call function (STILL THROWS 'no SOAPAction header!')
$result = $client->__soapCall( "getItemField", $params, $options );
Que suis-je censé faire si pas de soapAction est spécifié dans le fichier wsdl, c'est à dire s'il est réglé sur "".
N'est-ce pas l'en-tête SOAPAction liées à l'en-tête HTTP? Vérifier oreillynet.com/xml/blog/2002/11/...
OriginalL'auteur kingrichard2005 | 2011-11-22
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire, mais j'ai été en utilisant
cURL
et pas leSoapClient
, même si la solution peut être la même.Lors de l'envoi d'une demande à la fin du service, vous avez pour envoyer un en-tête précisant le
Content-Type
. Dans cet en-tête, vous pouvez également spécifier leaction
, ou "savon d'action".Dans mon cas, et ce qui semble être le même que le vôtre, le wsdl listes suivantes:
Au premier abord, je vois
soapAction=""
, j'ai donc misaction=""
dans les en-têtes envoyés. Cela n'a pas. Les données correctes qui va dans l'en-tête est leoperation
, rendantaction="getProducts"
.Basé sur le manuel pour
SoapClient
et la réponse à php à l'aide de SAVON avec un autre SoapAction, votre demande doit avoir travaillé avec:Avez-vous jamais omettre le
$options
envoyé à__soapCall()
tout simplement de ne pas spécifier une action (plutôt que de passer dans un vide)?OriginalL'auteur newfurniturey
Sa difficile de t'aider sans avoir tous les détails nécessaires, mais je vous conseille d'essayer le suivant:
avant de faire l'appel pour le service soap.
Espérons que cette aide.
SoapHeader est du remplissage de la <SOAP-ENV:Header/> la section de la requête SOAP. Il ne permet pas de définir un en-tête HTTP.
OriginalL'auteur profnotime