我目前正在爲我工作的公司開展一個項目。該項目需要向另一家公司(通過PHP)發出SOAP請求。我的PHP代碼中的SoapClient與另一公司的SOAP服務器進行通信,但我得到的只是「INVALID XML」。在檢查他們的WSDL和響應之後,我注意到他們的命名空間是不同的。我需要改變我的名字空間來匹配他們的名字空間。如何更改PHP中的SOAP名稱空間以匹配WSDL?
例如:我的請求中的標記顯示「ns1」。和「env。」,但他們顯示「肥皂」。
我該如何改變這種情況?
以下是我的代碼示例,請求發出和接收到的響應。
---------------- CODE ----------------
$client = new SoapClient("http://ws.example.com/test/test.asmx?WSDL", array('soap_version'=>SOAP_1_2, 'trace' => 1));
$result = $client->TestFunction(array('Packet'=>'<Email>[email protected]</Email><Password>examplepassword</Password>'));
$sessionid = $result->TestFunctionResult;
print $sessionid;
echo "REQUEST HEADER:\n" . htmlentities($client->__getLastRequestHeaders()) . "\n";
echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
echo "RESPONSE HEADER:\n" . htmlentities($client->__getLastResponseHeaders()) . "\n";
echo "RESPONSE:\n" . htmlentities($client->__getLastResponse()) . "\n";
------------ REQUEST SENT -------------
POST /test/test.asmx HTTP/1.1
Host: ws.example.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.4
Content-Type: application/soap+xml; charset=utf-8; action="http://ws.example.com/test/TestFunction"
Content-Length: 352
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ws.example.com/resumes/">
<env:Body>
<ns1:TestFunction>
<ns1:Packet>
<Email>[email protected]</Email>
<Password>examplepassword</Password>
</ns1:Packet>
</ns1:TestFunction>
</env:Body>
</env:Envelope>
---------- RESPONSE RECEIVED ----------
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 450
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-PBY: BEARWS2
Date: Mon, 18 Apr 2011 15:33:51 GMT
Connection: close
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<TestFunctionResponse xmlns="http://ws.example.com/test/">
<TestFunctionResult>
<Packet>
<Error>Invalid XML</Error>
</Packet>
</TestFunctionResult>
</TestFunctionResponse>
</soap:Body>
</soap:Envelope>
我怎樣才能解決這個問題呢?
我改變了標籤,除去其他公司的私有函數。那只是一個錯字。還有其他建議嗎? – Shattuck 2011-04-18 16:11:15
總是粘貼*正是*你發送的問題。重新打字是一個糟糕的主意。可能有其他原因,他們拒絕你的XML,但它不應該是因爲你爲命名空間選擇的前綴,這是任意的。 – 2011-04-18 16:13:01