Errror SOAPACTION value when I call a webservice
Hello all,
When I call a WSDL in php, look this code :
// Standard SOAP header for username/password
// From http://stackoverflow.com/questions/13465168/php-namespaces-in-soapheader-child-nodes
class WSSESecurityHeader extends SoapHeader {
public function __construct($username, $password)
{
$wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sece…';
$security = new SoapVar(
array(new SoapVar(
array(
new SoapVar($username, XSD_STRING, null, null, 'Username', $wsseNamespace),
new SoapVar($password, XSD_STRING, null, null, 'Password', $wsseNamespace)
),
SOAP_ENC_OBJECT,
null,
null,
'UsernameToken',
$wsseNamespace
)),
SOAP_ENC_OBJECT
);
parent::SoapHeader($wsseNamespace, 'Security', $security, false);
}
}
// Key parameters for connecting to the web service:
$location = "http://IP:PORT/csp/dsa-cla-prd/com.siemens.med.hs.Country.WebServices.pats.ClassPatientServices.cls";
$uri = "http://intersystems.fr";
$username = "USER";
$password = "PASS";
// If the soap client is to be constructed from the WSDL, or if the WSDL is to be used to generate
// PHP classes (using various tools that exist for that purpose), ?WSDL=1 and the username/password
// need to be tacked on to the end of the URL:
$wsdl = $location . "?WSDL=1&CacheUserName=" . $username . "&CachePassword=" . $password;
echo $wsdl.str_repeat('<br />', 4);
// Create SoapClient Object
$client = new SoapClient(null, array(
"trace" => 1,
"location" => $location,
"uri" => $uri,
"style" => SOAP_DOCUMENT,
"use" => SOAP_LITERAL));
// Add security header.
$client->__setSoapHeaders(new WSSESecurityHeader($username, $password));
//echo '<xmp>';
//print_r($client);
//echo '</xmp>';
// Object with parameter names and values for the SOAP call
try {
$clsINOUTContext = new stdClass();
$clsINOUTContext->AccessCode = 'ACC';
$ClsOUTInfosPatient = new stdClass();
$params = array(
'clsINOUTContext' => $clsINOUTContext,
'strINPatientIPP' => "11111111",
'ClsOUTInfosPatient' => $ClsOUTInfosPatient
);
echo '<xmp>';
print_r($params);
echo '</xmp>';
$return = $client->GetPatientInfo($params);
var_dump($return);
} catch (Exception $e) {
echo "Exception occured: " . $e;
}
I have this error :
Exception occured: SoapFault exception: [SOAP-ENV:Client] Erreur dans le WebService: Erreur interne détectée. ERROR #6207: Unexpected SOAPACTION value: http://intersystems.fr#GetPatientInfo in C:\wamp\www\clinicom_webservice\index.php:81 Stack trace: #0 C:\wamp\www\clinicom_webservice\index.php(81): SoapClient->__call('GetPatientInfo', Array) #1 C:\wamp\www\clinicom_webservice\index.php(81): SoapClient->GetPatientInfo(Array) #2 {main}
Can you help me ?
Thanks a lot for explains,
Comments
It looks like some of this may have come from https://community.intersystems.com/post/example-connecting-cach%C3%A9-web-service-php
The remainder of that example may also be useful, for demonstrating how to use the correct SOAPACTION (which the error message you have refers to). This entails using __soapCall with an array of options including the expected SOAPACTION value.
// Object with parameter names and values for the SOAP call
$request = new stdClass();
$request->id = $id;
// This goes in an associative array with key FindPersonSoapIn (see WSDL)
$params = array();
$params['FindPersonSoapIn']=$request;
// In the array of options for the soap call, soapaction must be specified since there's no WSDL to refer to.
// PHP provides a default value of <uri>#<method>, but that's incorrect.
$options = array('soapaction'=>$uri.'/SOAP.Demo.FindPerson');
// Actually call the web service
$result = $client->__soapCall("FindPerson",$params,$options);Thanks for your help it's run better,
but now I have this error :
Exception occured: SoapFault exception: [SOAP-ENV:Client] Erreur dans le WebService: Erreur interne détectée. ERROR #6237: Unexpected tag in XML input: AccessCode (ending at line 2 character 379). in C:\wamp\www\clinicom_webservice\index.php:93 Stack trace: #0 C:\wamp\www\clinicom_webservice\index.php(93): SoapClient->__soapCall('GetPatientInfo', Array, Array) #1 {main}
My code :
//
$IPP = '111111113';
//
$clsINOUTContext = new stdClass();
$clsINOUTContext->AccessCode = 'CWP';
//
$ClsOUTInfosPatient = new stdClass();
$params = array(
'clsINOUTContext' => $clsINOUTContext,
'strINPatientIPP' => $IPP,
'ClsOUTInfosPatient' => $ClsOUTInfosPatient
);
$options = array('soapaction'=>$uri.'/[Country].WebServices.pats.ClassPatientServices.GetPatientInfo');
//Call WS
$result = $client->__soapCall("GetPatientInfo",$params,$options);
var_dump($result);
Can you help me ?
Perhaps consider using SOAP logging (see documentation) to compare a valid request from a web client that works (using a Caché-based client or a third-party tool like SoapUI) to what your PHP client is sending - that might make it more obvious how the correct XML differs from what PHP is sending.
hello all !
I progress it's a good news ;-), so now I have this code :
try {
//
$clsINOUTContext = new StdClass();
$clsINOUTContext->ClsINOUTContext = new StdClass();
$clsINOUTContext->ClsINOUTContext->AccessCode = 'AAA';
//
$params = array(
'ClsINOUTContext' => $clsINOUTContext,
'strINPatientIPP' => "11111111"
);
echo '<xmp>';
print_r($params);
echo '</xmp>';
$options = array('soapaction'=>$uri.'/[URL].ClassPatientServices.GetPatientInfo');
//Call WS
$result = $client->__soapCall("GetPatientInfo",$params,$options);
var_dump($result);
} catch (Exception $e) {
echo "Exception occured: " . $e;
The result is this :
array (size=2)
'GetPatientInfoResult' => string 'false' (length=5)
'ClsINOUTContext' =>
object(stdClass)[9]
[...]
public 'ErrDesc' => string 'Erreur: IPP manquant.' (length=21)
public 'ErrorExists' => string 'true' (length=4)
public 'ErrCount' => string '1' (length=1)
[...]You know the problem because i send the IPP in string ?
Hello
No ideas about my last problem ?
Thanks
Hello,
I'm not very far from the result, what's missing ? Help me please
Thanks a lot
Is the GetPatientInfo method of your com.siemens.med.hs.Country.WebServices.pats.ClassPatientServices class responding with that message?
Yes, this is the reply:
array (size=2)
'GetPatientInfoResult' => string 'false' (length=5)
'ClsINOUTContext' =>
object(stdClass)[10]
public 'AccessCode' => string '[ACCCODE]' (length=3)
public 'UserName' => string '[USERNAME]' (length=6)
public 'HospID' => string '01' (length=2)
public 'Group' => string '[GROUPE]' (length=7)
public 'Environment' => string 'PRD' (length=3)
public 'Status' => string 'MA==' (length=4)
public 'ClassFunction' => string 'com.siemens.med.hs.Country.WebServices.pats.ClassPatientServices' (length=62)
public 'CurrentFunction' => string 'GetPatientInfo' (length=14)
public 'SHSErrCode' => string '0' (length=1)
public 'ErrDesc' => string 'Erreur: IPP manquant.' (length=21)
public 'ErrorExists' => string 'true' (length=4)
public 'ErrCount' => string '1' (length=1)
public 'AvertExists' => string 'false' (length=5)
public 'AvertCount' => string '0' (length=1)
public 'RunAsWebService' => string 'true' (length=4)
public 'TraceWrite' => string 'false' (length=5)
public 'TraceLogToFile' => string 'false' (length=5)
public 'TraceLogFile' => string '/sms/logfile.txt' (length=16)
public 'NameSpace' => string '[DD]' (length=11)
public 'GUID' => string '[N°]' (length=36)
public 'IsInTestMode' => string 'false' (length=5)Can you read the Caché ObjectScript code that implements the GetPatientInfo method in the com.siemens.med.hs.Country.WebServices.pats.ClassPatientServices class, and work out why it returns ErrDesc="Erreur: IPP manquant." ?
Yes this is my SOAP request:
<SOAP-ENV:Envelope xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sece…" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<ns1:Security>
<ns1:UsernameToken>
<ns1:Username>USERNAME</ns1:Username> <ns1:Password>USERPASS</ns1:Password> </ns1:UsernameToken> </ns1:Security> </SOAP-ENV:Header>
<SOAP-ENV:Body>
<param0>
<ClsINOUTContext>
<AccessCode>CCP</AccessCode> </ClsINOUTContext>
</param0>
<param1>
<strINPatientIPP>11111111</strINPatientIPP> </param1>
Hello,
You can't help me more ?
Please
Yes this is my SOAP request:
<SOAP-ENV:Envelope xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sece…" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<ns1:Security>
<ns1:UsernameToken>
<ns1:Username>USERNAME</ns1:Username> <ns1:Password>USERPASS</ns1:Password> </ns1:UsernameToken> </ns1:Security> </SOAP-ENV:Header>
<SOAP-ENV:Body>
<param0>
<ClsINOUTContext>
<AccessCode>CCP</AccessCode> </ClsINOUTContext>
</param0>
<param1>
<strINPatientIPP>11111111</strINPatientIPP> </param1>