node-soap добавляет пространство имен в конверт - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь использовать этот сервис мыла: http://testws.truckstop.com:8080/v13/Posting/LoadPosting.svc?singleWsdl с помощью узла-мыла, но клиент искажает пространства имен, и мне не удалось найти работающее решение.

Я полагаю, что ответ заключается в том, чтобы либо добавить пространство имен в мыльный конверт, либо перезаписать мыльный конверт.

Используя Soap UI, запрос должен выглядеть следующим образом:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:v11="http://webservices.truckstop.com/v11" 
xmlns:web="http://schemas.datacontract.org/2004/07/WebServices">
   <soapenv:Header/>
   <soapenv:Body>
      <v11:GetLoads>
         <v11:listRequest>
            <web:IntegrationId>integrationId</web:IntegrationId>
            <web:Password>password</web:Password>
            <web:UserName>username</web:UserName>
         </v11:listRequest>
      </v11:GetLoads>
   </soapenv:Body>
</soapenv:Envelope>

Однако, когда я делаю:

client = soap.createClient(url);
let query = {
        listRequest: {
            Password: password,
            UserName: username,
            IntegrationId: integrationId
        }
    };
let results = client.GetLoads(query);

Клиент генерирует этот xml:

<?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" 
        xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
        xmlns:tns="http://webservices.truckstop.com/v11" 
        xmlns:q1="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q2="http://schemas.datacontract.org/2004/07/WebServices.Objects" 
        xmlns:q3="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q4="http://schemas.datacontract.org/2004/07/WebServices.Objects" 
        xmlns:q5="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q6="http://schemas.datacontract.org/2004/07/WebServices.Objects" 
        xmlns:q7="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q8="http://schemas.datacontract.org/2004/07/WebServices.Objects" 
        xmlns:q9="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q10="http://schemas.datacontract.org/2004/07/WebServices.Objects" 
        xmlns:q11="http://schemas.datacontract.org/2004/07/WebServices.Posting" 
        xmlns:q12="http://schemas.datacontract.org/2004/07/WebServices.Objects">
        <soap:Body>
            <GetLoads xmlns="http://webservices.truckstop.com/v11">
                <listRequest>
                    <ns1:IntegrationId>integrationId</ns1:IntegrationId>
                    <ns1:Password>password</ns1:Password>
                    <ns1:UserName>usernam</ns1:UserName>
                </listRequest>
            </GetLoads>
        </soap:Body>
    </soap:Envelope>

Это не удается, потому что IntegrationId, Password и UserName нужно http://schemas.datacontract.org/2004/07/WebServices, но пространство имен не указано в конверте.

Я попытался обновить клиент, чтобы добавить пространство имен, как предложено :

client.wsdl.definitions.xmlns.ns1 = "http://schemas.datacontract.org/2004/07/WebServices";
client.wsdl.xmlnInEnvelope = client.wsdl._xmlnsMap();

Iможет видеть пространство имен в client.wsdl.xmlnInEnvelope, но оно, похоже, не меняет фактический сгенерированный xml.

Требуется ли еще один шаг, чтобы обновить клиент для использования обновленного конверта?

Iтакже попытался переопределить корневой элемент, как показано здесь :

        var wsdlOptions = {
            //namespaceArrayElements: "xmlns:ns1=http://schemas.datacontract.org/2004/07/WebServices"

            "overrideRootElement": {
                "namespace": "xmlns:tns",
                "xmlnsAttributes": [{
                    "name": "xmlns:tns",
                    "value": "http://webservices.truckstop.com/v11"
                }, {
                    "name": "xmlns:ns1",
                    "value": "http://schemas.datacontract.org/2004/07/WebServices"
                }]
            }
        };
        this.loadPostClient = soap.createClient(this.tsConfig.loadPostUrl, wsdlOptions);

Это меняет корневой элемент тела:

<soap:Body>
    <xmlns:tns:GetLoads 
        xmlns:tns="http://webservices.truckstop.com/v11" 
        xmlns:ns1="http://schemas.datacontract.org/2004/07/WebServices">
        <listRequest>
            <ns1:IntegrationId>integrationId</ns1:IntegrationId>
            <ns1:Password>password</ns1:Password>
            <ns1:UserName>username</ns1:UserName>
        </listRequest>
    </xmlns:tns:GetLoads>
</soap:Body>

Но удаленный сервер не понимает.

Спасибо за чтение!

1 Ответ

0 голосов
/ 06 октября 2018

Этот ответ был правильным все время

Он не работал для меня из-за автозаполнения и подобных полей

client.wsdl.xmlnInEnvelope = client.wsdl._xmlnsMap();

Должно было быть:

client.wsdl.xmlnsInEnvelope = client.wsdl._xmlnsMap();

Я пропустил s и устанавливал xmlnInEnvelope вместо xmln s InEvelope

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...