SOAPUI и Node.JS / Request- AccessException - PullRequest
5 голосов
/ 22 июня 2019

Я пытаюсь создать инструмент отслеживания отправлений с помощью веб-служб отслеживания отправлений Estes, использующих SOAP.Я поговорил с их веб-службой поддержки, и они могут создать рабочий запрос с использованием SOAPUI, который получает действительный ответ, используя мои учетные данные.Может показаться, что моя проблема заключается в невозможности репликации запроса / ответа в SOAPUI с помощью node.js.Почему я не могу реплицировать запрос / ответ SOAPUI в node.js?

Ниже приведен рабочий необработанный запрос от SOAPUI, используемый веб-поддержкой Estes:

POST https://api.estes-express.com:443/ws/estesrtshipmenttracking.base.ws.provider.soapws:EstesShipmentTracking/estesrtshipmenttracking_base_ws_provider_soapws_EstesShipmentTracking_Port HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "estesrtshipmenttracking_base_ws_provider_soapws_EstesShipmentTracking_Binder_shipmentTracking"
Content-Length: 468
Host: api.estes-express.com:443
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Authorization: Basic XXXXX

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="https://api.estes-express.com/ws/tools/shipment/tracking/v1.1/">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:shipmentTracking>
         <search>
            <requestID>testroger</requestID>
            <!--Optional:-->
            <pro>XXXXXX</pro>
         </search>
         <debug>N</debug>
      </v1:shipmentTracking>
   </soapenv:Body>
</soapenv:Envelope>

Приведенная выше информация о базовой аутентификации в кодировке Base 64 не указана, но, уверяю вас, я использую точно такое же значение в своем запросе.

Мой запрос ниже, с использованием node.js.Я должен отметить, что я предоставляю информацию прокси в своем запросе, но я убедился, что она работает в других функциях запроса.

function estes(obj) {

    var auth = 'Basic XXXXXXX'

    var url = 'https://api.estes-express.com:443/ws/estesrtshipmenttracking.base.ws.provider.soapws:EstesShipmentTracking/estesrtshipmenttracking_base_ws_provider_soapws_EstesShipmentTracking_Port'

    const request = require('request')
    const fs = require('fs');
    const xml = fs.readFileSync('estessample.xml', 'utf-8');

    request.post({
        uri: url,
        headers: {
            'SOAPAction': 'estesrtshipmenttracking_base_ws_provider_soapws_EstesShipmentTracking_Binder_shipmentTracking',
            'Content-Type': 'text/xml;charset=UTF-8',
            'Content-Length': xml.length,
            'Host': 'api.estes-express.com:443',
            'Authorization': auth
        },
        proxy: 'XXXXXX',
        body: xml
    }, function (error, response, body) {
        console.log(body)

        fs.writeFile("response.txt", body, (err) => {
            if (err) console.log(err);
            console.log("Successfully Written to File.");
        });
    })
}

Это XML, который я публикую в их сервисе (estessample.xml)Это то же самое, что использовала команда веб-служб Estes, которая работала выше:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="https://api.estes-express.com/ws/tools/shipment/tracking/v1.1/">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:shipmentTracking>
         <search>
            <requestID>testroger</requestID>
            <!--Optional:-->
            <pro>XXXXXXX</pro>
         </search>
         <debug>N</debug>
      </v1:shipmentTracking>
   </soapenv:Body>
</soapenv:Envelope>

И, наконец, вот ошибка, которую я получаю в response.xml:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Client</faultcode>
         <faultstring>[ISS.0088.9164] Access to WSDescriptor estesrtshipmenttracking.base.ws.provider.soapws:EstesShipmentTracking denied.</faultstring>
         <faultactor>http://api.estes-express.com/tools</faultactor>
         <detail>
            <webM:exception xmlns:webM="http://www.webMethods.com/2001/10/soap/encoding">
               <webM:className>com.wm.app.b2b.server.AccessException</webM:className>
               <webM:message xml:lang="">[ISS.0088.9164] Access to WSDescriptor estesrtshipmenttracking.base.ws.provider.soapws:EstesShipmentTracking denied.</webM:message>
            </webM:exception>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

0 голосов
/ 01 июля 2019

Ошибка связана с ошибкой аутентификации. Я просто попытался получить доступ к конечной точке и получил похожую ошибку.

Я полагаю, вы используете этот модуль узла https://github.com/request/request

После просмотра кода, которым вы поделились, я думаю, это может быть связано с тем, как вы сформировали запрос POST. Я бы предложил более подробно изучить документацию request.

request.post({
    uri: url,
    headers: {
        'SOAPAction': 'estesrtshipmenttracking_base_ws_provider_soapws_EstesShipmentTracking_Binder_shipmentTracking',
        'Content-Type': 'text/xml;charset=UTF-8'
    },
    'auth': {
      'user': '<username>',
      'pass': '<password>',
    },
    body: xml,
}, function (error, response, body) {
   // Code Omitted
})

Упрощенный образец, показанный выше. Обратите внимание на раздел авторизации. Модуль также позаботится о настройке заголовка content-length.

...