2016-08-13 63 views
4

我從wsdl文件創建了Web服務對象,並在下面調用它。我也打印結果。此代碼不起作用。 Web服務器返回錯誤。因爲請求沒有命名空間。如何在節點肥皂中添加「命名空間」以請求節點肥皂

soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl', function(err, client) { 
. 
. 
var params= {"custId":"123"}; 
client.getCustomerDetails.getCustomerDetailsPort.getCustomerDetails(params,function(err,result){ 
    console.log("lastRequest:"+client.lastRequest); 
    if (err != null) 
     console.log("error:"+JSON.stringfy(error)); 

}); 

} 

在這裏我看到了最後的請求

<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" > 
.... 
    <soap:Body> 
    <getCustomerDetailsRequest> 
     <custId>123</custId> 
    </getCustomerDetailsRequest> 
    </soap:Body>... 

,但它必須是

<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" > 
    .... 
    <soap:Body> 
    <tns:getCustomerDetailsRequest> 
     <tns:custId>123</tns:custId> 
    </tns:getCustomerDetailsRequest> 
    </soap:Body>... 

如你所見,肥皂模塊不tns命名空間添加到該請求。我嘗試var params= {"tns:custId":"123"};,它將命名空間添加到參數,但它仍不會將名稱空間添加到請求getCustomerDetailsRequest。因此,我得到Unexpected element getCustomerDetailsRequest found. Expected {http://example.com/api/getCustomerDetails/V01}getCustomerDetailsRequest

我該如何強制將該名稱空間添加到方法本身?

回答

6

我發現我可以做到這一點。我認爲它由於「肥皂」模塊中的錯誤而在默認情況下不起作用。默認情況下,它不會將名稱空間添加到請求主體。 「soap」默認使用「tns」作爲命名空間。在wsdlOptions中有一個選項。它是overrideRootElement。如果您嘗試使用tns覆蓋overrideRootElement,則它不會將tns添加到請求正文。您必須在overrideRootElement中使用不同的命名空間。在這裏我的解決方案,

我首先創建我的wsdlOptions對象。

var wsdlOptions = { 
    "overrideRootElement": { 
    "namespace": "myns", 
    "xmlnsAttributes": [{ 
     "name": "xmlns:myns", 
     "value": "http://example.com/api/getCustomerDetails/V01" 
    }] 
    } 
}; 

,然後使用它,當我創建SOAP客戶端,

soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl',wsdlOptions, function(err, client) { 
. 
. 
. 
} 
); 

它使請求身體使用myns作爲根元素的命名空間。現在,我要修改參數的命名空間,所以我定義的參數爲

var params= {"myns:custId":"123"}; 

現在,它創建請求作爲

<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" > 
    .... 
    <soap:Body> 
    <myns:getCustomerDetailsRequest xmlns:myns="http://example.com/api/getCustomerDetails/V01"> 
     <myns:custId>123</tns:custId> 
    </myns:getCustomerDetailsRequest> 
    </soap:Body>... 

以及現在的Web服務器接受它。

請記住,即使tns是在根中定義的,它不會自動添加到請求體中。另外,如果您嘗試再次使用tns重寫wsdlOptions,它仍然不起作用。你必須使用不同的值作爲名稱空間,如myns

+0

我如何使用請求庫調用通過json而不是xml? 我有xmlns的問題 –