問題描述
我厭倦了嘗試使用 SOAP 發送請求.這是我的 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 send the header with a namespace, but there are more than one... 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);
我嘗試發送此正文,我檢查了帶有soap錯誤的異常,但該消息僅返回錯誤請求NULL NULL NULL".
I try to send this body, I inspected exception with soap fault but the message only returns "bad request 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);
}
使用 CURL 我可以發送這個 XML 并收到 XML 響應,但是使用 SOAPClient 我不能發送這個請求.
With CURL I can send this XML and recieved the XML response too, but with SOAPClient I can't send this request.
希望有人能幫助我,謝謝.
I hope someone can help me, thanks.
這是我可以用 firebug 看到的代碼,我唯一得到的是錯誤的請求".當我使用 __getLastRequest() 我看到同樣的......我猜不應該正確發送標頭,但是 __setSoapHeaders 函數返回 true.這是輸出:
This is the code I can see with firebug, the only thing I get is "bad request". When I use __getLastRequest() I see the same... I guess the headers should not be sent correctly, however the __setSoapHeaders function returns true. This is the output:
<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>
推薦答案
SoapHeader
處理數組相當隨意.如果您想使用數組,請考慮使用 ArrayObject
而不是原生結構.
SoapHeader
treats arrays rather arbitrarily. If you ever want to use an array, consider using ArrayObject
instead of the native construct.
但是,您根本不需要數組,因為您只是想在標題中構造單個元素.并且因為您的每個內部元素(例如 ClientIP)都有一個唯一的命名空間,所以您不能只傳入一個基本對象.相反,您必須使用 SoapVar
類為每個元素指定一個特定的命名空間,這允許您將普通 PHP 數據包裝在 SoapClient
可以的SOAP-ready"容器中理解和翻譯.
However, you don't need an array at all since you're only trying to construct a single element in your header. And because each of your internal elements (eg. ClientIP) has a unique namespace, you can't just pass in a basic object. Instead, you have to specify a particular namespace for each element using the SoapVar
class, which allows you to wrap normal PHP data in a "SOAP-ready" 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));
最后,作為一項規則,不要手動編寫 XML! 考慮像此處顯示的標頭代碼那樣重新編寫 SOAP 主體代碼.您應該能夠專門處理 XML 的內容,而不是它的結構.
Finally, as a rule, don't manually write XML! Consider re-writing your SOAP body code like the header code shown here. You ought to be able to deal specifically with the content of the XML, not its structure.
這篇關于如何從此xml在php中生成soap請求?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!