1
我正試圖訪問我能夠輕鬆使用Boomerang的SOAP API。這裏是請求的格式:SOAP API請求適用於Boomerang,但不適用於節點皁
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v="http://ws.aramex.net/ShippingAPI/v1/" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<x:Header/>
<x:Body>
<v:ShipmentTrackingRequest>
<v:ClientInfo>
<v:UserName>myUsernameHere</v:UserName>
<v:Password>myPasswordHere</v:Password>
<v:Version>v1.0</v:Version>
<v:AccountNumber>MyAccNumberHere</v:AccountNumber>
<v:AccountPin>MyPinHere</v:AccountPin>
<v:AccountEntity>XYZ</v:AccountEntity>
<v:AccountCountryCode>XYZ</v:AccountCountryCode>
</v:ClientInfo>
<v:Transaction>
<v:Reference1>001</v:Reference1>
<v:Reference2>?</v:Reference2>
<v:Reference3>?</v:Reference3>
<v:Reference4>?</v:Reference4>
<v:Reference5>?</v:Reference5>
</v:Transaction>
<v:Shipments>
<arr:string>41496248135</arr:string>
</v:Shipments>
<v:GetLastTrackingUpdateOnly>true</v:GetLastTrackingUpdateOnly>
</v:ShipmentTrackingRequest>
</x:Body>
</x:Envelope>
該請求得到我所需的全部信息。但我想用node-soap來提出同樣的要求。這是我的代碼:
var soap = require('soap');
var express = require('express');
var app = express();
var url = 'aramex/aramex.wsdl';
var args = [{
ClientInfo:
{
UserName: 'myUsernameHere',
Password: 'myPasswordHere',
Version: 'v1.0',
AccountNumber: 'MyAccNumberHere',
AccountPin: 'MyPinHere',
AccountEntity: 'XYZ',
AccountCountryCode: 'XYZ'
},
Transaction:
{ Reference1: '001' },
Shipments: ['41496248135']
}];
app.get('/', function(req, res){
soap.createClient(url, function(err, client) {
client.TrackShipments(args, function(err, result, body) {
res.send(result);
});
});
})
app.listen(process.env.PORT, process.env.IP, function(){
console.log("Server Up");
})
我得到的只是result
中的一個大錯誤。 result
對象的主體如下:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode><faultstring xml:lang="en-US">Error in deserializing body of request message for operation 'TrackShipments'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'ShipmentTrackingRequest' and namespace 'http://ws.aramex.net/ShippingAPI/v1/'. Found node type 'Element' with name 'ShipmentTrackingRequest' and namespace ''</faultstring><detail><ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HelpLink i:nil="true"/><InnerException><HelpLink i:nil="true"/><InnerException i:nil="true"/><Message>OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'ShipmentTrackingRequest' and namespace 'http://ws.aramex.net/ShippingAPI/v1/'. Found node type 'Element' with name 'ShipmentTrackingRequest' and namespace ''</Message><StackTrace> at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
 at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
 at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)</StackTrace><Type>System.Runtime.Serialization.SerializationException</Type></InnerException><Message>Error in deserializing body of request message for operation 'TrackShipments'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'ShipmentTrackingRequest' and namespace 'http://ws.aramex.net/ShippingAPI/v1/'. Found node type 'Element' with name 'ShipmentTrackingRequest' and namespace ''</Message><StackTrace> at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)
 at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
 at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
 at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
 at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
 at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace><Type>System.ServiceModel.CommunicationException</Type></ExceptionDetail></detail></s:Fault></s:Body></s:Envelope>
我該如何解決這個問題?