How to create a soap request in php from this xml?

I'm tired of trying to send a request with SOAP. this is my xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common" xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common"> <soapenv:Header> <InfoTag xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/BaufestProductivityFramework"> <ClientIp xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">200.125.145.10</ClientIp> <CompanyId xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">1</CompanyId> <UserName xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">someUser</UserName> </InfoTag> </soapenv:Header> <soapenv:Body> <tem:LogIn> <tem:token> <bpf:type> <bpf1:Description>someDesc</bpf1:Description> <bpf1:Id>1</bpf1:Id> <bpf1:Name>someDesc</bpf1:Name> </bpf:type> <bpf:password>somePass</bpf:password> <bpf:userName>someUser</bpf:userName> </tem:token> </tem:LogIn> </soapenv:Body> </soapenv:Envelope> 

this function sends a header with a namespace, but there are more than one ... Do I have to send them all?

  private function __getHeaders() { $ns = 'http://schemas.xmlsoap.org/soap/envelope/'; //Namespace of the WS. $ip = $_SERVER['REMOTE_ADDR']; //Body of the Soap Header. $headerbody = array('ClientIp' => $ip, 'CompanyId' => 1, 'UserName' => 'someUser' ); //Create Soap Header. $header = new SOAPHeader($ns, 'InfoTag', $headerbody); return $header; } public function prepareWs(){ $wsdl="the web service"; $client = new SoapClient($wsdl, array('trace' => true)); //Set the Headers of Soap Client. $header = $this->__getHeaders(); $client->__setSoapHeaders($header); 

I'm trying to send this body, I checked the exception with a soap error, but the message returns only "invalid NULL NULL NULL NULL".

 $params = new stdClass(); $params = new SoapVar("<tem:token> <bpf:type xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common"> <bpf1:Description xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someDesc</bpf1:Description> <bpf1:Id xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">1</bpf1:Id> <bpf1:Name xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someName</bpf1:Name> </bpf:type> <bpf:password xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">somePass</bpf:password> <bpf:userName xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">someUser</bpf:userName> </tem:token>", XSD_ANYXML); $response = $client->Login($params); } 

With CURL, I can send this XML and get an XML response too, but with SOAPClient I can not send this request.

I hope someone can help me, thanks.

This is the code I see with firebug, the only thing I get is a β€œbad request”. When I use __getLastRequest (), I see the same thing ... I think the headers should not be sent correctly, however, the __setSoapHeaders function returns true. This is the result:

 <soap-env:envelope xmlns:ns1="http://tempuri.org/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:header> <soap-env:contextinformation> <item> <key>ClientIp</key> <value>127.0.0.1</value> </item> <item> <key>CompanyId</key> <value>1</value> </item> <item> <key>UserName</key> <value>someUser</value> </item> </soap-env:contextinformation> </soap-env:header> <soap-env:body> <tem:login> <tem:token> <bpf:type> <bpf1:description>someDesc</bpf1:description> <bpf1:id>1</bpf1:id> <bpf1:name>someName</bpf1:name> </bpf:type> <bpf:password>somePass</bpf:password> <bpf:username>someUser</bpf:username> </tem:token> </tem:login> </soap-env:body> </soap-env:envelope> 
+4
soap xml php request
source share
1 answer

SoapHeader processes arrays rather randomly. If you ever want to use an array, consider using an ArrayObject instead of an inline construct .

However, you do not need an array at all, since you are trying to create only one element in your header. And since each of your internal elements (such as ClientIP ) has a unique namespace, you cannot just pass in the underlying object. Instead, you need to specify a specific namespace for each element using the SoapVar class, which allows you to wrap regular PHP data in a SOAP-enabled container that SoapClient can understand and translate.

 $innerNS = "http://www.w3.org/BaufestProductivityFramework"; $outerNS = "http://schemas.datacontract.org/2004/07/Bpf.Common.Service"; $tag = new stdClass(); $tag->ClientIP = new SoapVar("200.125.145.10", XSD_STRING, null, null, null, $innerNS); $tag->CompanyId = new SoapVar(1, XSD_INT, null, null, null, $innerNS); $tag->UserName = new SoapVar("someUser", XSD_STRING, null, null, null, $innerNS); $client->__setSoapHeaders(new SoapHeader($outerNS, 'InfoTag', $tag)); 

Finally, as a rule, do not manually write XML! . Consider re-writing your SOAP body code, such as the header code shown here. You should be dealing with XML content, not its structure.

+2
source share

All Articles