2011-04-18 88 views
1

我目前正在爲我工​​作的公司開展一個項目。該項目需要向另一家公司(通過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> 


我怎樣才能解決這個問題呢?

回答

5

前綴名稱無關緊要。他們不是你的問題的原因。看起來您在這裏有一個不匹配的標籤:

<ns1:TestFunciton> 
    <ns1:Packet> 
     <Email>[email protected]</Email> 
     <Password>examplepassword</Password> 
    </ns1:Packet> 
</ns1:TestFunction> 

請注意拼寫錯誤TestFunciton

+0

我改變了標籤,除去其他公司的私有函數。那只是一個錯字。還有其他建議嗎? – Shattuck 2011-04-18 16:11:15

+0

總是粘貼*正是*你發送的問題。重新打字是一個糟糕的主意。可能有其他原因,他們拒絕你的XML,但它不應該是因爲你爲命名空間選擇的前綴,這是任意的。 – 2011-04-18 16:13:01

0

我想知道爲什麼要插入XML標記作爲「數據包」的值。如果正確完成(抱歉,我目前無法自己檢查它),SoapClient應該將它們作爲實體轉義,這會破壞您的請求。另外我想知道爲什麼你的請求轉儲不能更正確地顯示,但我認爲這可能是由於你編輯的東西而不是複製&粘貼。

如果做得正確,我推測,您的要求應該是這樣的:

$client->TestFunction(
    array(
     'Packet'=> array(
      'Email' => '[email protected]', 
      'Password' => 'examplepassword', 
     ) 
    ) 
); 
相關問題