#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) })
, получая ошибку зависания сокета с кодом econnreset4. Да, я только что попытался вызвать API с помощью Postman, он зависает. Я также получаю
socket hang up
. Я думаю, что он сломан / отключен.5. Это потому, что аутентификация клиента https не предусмотрена в запросе. Для доступа к api через браузер необходим сертификат клиента, и api работает. Но я не знаю, как пройти через node.js