XMLHttpRequest возвращает ответ «undefined» со статусом 0 в NodeJS

#javascript #node.js #web-services #soap #xmlhttprequest

#javascript #node.js #веб-сервисы #soap #xmlhttprequest

Вопрос:

Я отправляю запрос в веб-службу EJBCA. Пожалуйста, посмотрите мой код ниже. Я получаю undefined ответ, и печатаемый статус равен 0.

 let XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
const fs = require('fs');

let xmlhttp = new XMLHttpRequest();

xmlhttp.open('POST', 'https://104.211.18.242/ejbca/ejbcaws/ejbcaws', true, 'ejbcaadmin', 'iBOTControls@123');

var strRequest = `
    <x:Envelope
    xmlns:x="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ws="http://ws.protocol.core.ejbca.org/">
    <x:Header/>
    <x:Body>
        <ws:getAvailableCAs></ws:getAvailableCAs>
    </x:Body>
    </x:Envelope>
    `;

xmlhttp.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
xmlhttp.setRequestHeader('Access-Control-Allow-Origin', '*');
xmlhttp.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS');
xmlhttp.setRequestHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-client-key, x-client-token, x-client-secret, Authorization');


//send the SOAP request
xmlhttp.send(strRequest);

//Callback function for response
xmlhttp.onreadystatechange = function () {
    console.log(xmlhttp.response) // returns undefined
    console.log(xmlhttp.status) // prints 0
    fs.writeFileSync('./response.txt', xmlhttp.responseXML)
}

  

Для отправки запроса в эту веб-службу требуется проверка подлинности клиента https. Когда я отправляю запрос через браузер, мне нужно выбрать сертификат, а затем я получаю ответ 200. Поскольку я не прикрепляю сертификат в node.js , может быть, это провал?

Комментарии:

1. Почему вы устанавливаете заголовки управления доступом? Они являются заголовками ответа и не имеют места в запросе … и в любом случае они применяются только к браузерам.

2. Зачем беспокоиться? Используйте библиотеку, подобную Axios. const response = await axios.post(url, strRequest) , работа выполнена

3. @JeremyThille Я использовал axios, подобный этому let instance = axios.create({ headers: { 'Content-type': 'text/xml; charset=utf-8' } }); instance.post('https://104.211.18.242/ejbca/ejbcaws/ejbcaws', strRequest) .then((res) => { console.log(res.data) }) .catch((e) => { console.log(e) }) , получая ошибку зависания сокета с кодом econnreset

4. Да, я только что попытался вызвать API с помощью Postman, он зависает. Я также получаю socket hang up . Я думаю, что он сломан / отключен.

5. Это потому, что аутентификация клиента https не предусмотрена в запросе. Для доступа к api через браузер необходим сертификат клиента, и api работает. Но я не знаю, как пройти через node.js