2016-07-21 1 views
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에 큰 오류입니다 : 여기 내 코드입니다.

<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)&#xD; at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)&#xD; 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)&#xD; at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace><Type>System.ServiceModel.CommunicationException</Type></ExceptionDetail></detail></s:Fault></s:Body></s:Envelope> 

가 어떻게이 문제를 해결할 수

다음과 같이 result 개체의 몸은 무엇입니까?

답변

0

여전히 관련성이있는 경우 동일한 문제가 발생했습니다. Aramex의 웹 사이트에서 최신 WDSL 파일을 가져옵니다. WSDL에 파서가 WSDL 파일 내부에 정의 된 것과 우리의 인수 목록과 일치 할 수 없기 때문에

let args = [{ 
    ClientInfo: { 
     UserName: 'myUsernameHere', 
     Password: 'myPasswordHere', 
     Version: 'v1.0', 
     AccountNumber: 'MyAccNumberHere', 
     AccountPin: 'MyPinHere', 
     AccountEntity: 'XYZ', 
     AccountCountryCode: 'XYZ'   
    }, 
    "Transaction": { 
     "Reference1": "001", 
     "Reference2": "002", 
     "Reference3": "003", 
     "Reference4": "004", 
     "Reference5": "005" 
    }, 
    "Shipments": { 
      "string": awb 
    }, 
    "GetLastTrackingUpdateOnly": false] 
}]; 

당신이 얻고있는 오류는 주로 다음과 같이

요청 인수가 있어야합니다.