#javascript #node.js #axios
Вопрос:
Я хочу предоставить файл cookie в почтовом запросе с помощью Axios. У меня есть API zeppelin, который работает с CURL как:
curl -i --data 'userName=adminamp;password=admin' -X POST http://zeppelin.XXXXX.net/api/login
и реакция
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization,Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, HEAD, DELETE
Content-Length: 127
Content-Type: application/json
Date: Wednesday, September 1, 2021 8:20:55 AM UTC
Server: Jetty(9.4.14.v20181114)
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: JSESSIONID=a3a4392d-1347-47b6-b85b-61230e16802b; Path=/; HttpOnly
Set-Cookie: JSESSIONID=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1
Чтобы использовать заметку в zeppelin
curl -i -b 'JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly' -X POST http://zeppelin.XXXXXX.net/api/notebook/job/2G9P1992Z/20210615-091750_1582099873
преуспевает с
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization,Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, HEAD, DELETE
Content-Length: 15
Content-Type: application/json
Date: Wednesday, September 1, 2021 8:28:07 AM UTC
Server: Jetty(9.4.14.v20181114)
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1
У меня есть функция для входа в систему и получения файла cookie
const axios = require('axios')
const setCookie = require('set-cookie-parser');
const zeppelinLoginCoockie = async function(){
return new Promise((resolve, reject) => {
axios
.post(process.env.ZEPPELIN_URL 'login', 'userName=adminamp;password=admin')
.then(res => {
console.log(`statusCode: ${res.status}`);
//console.log(res);
let cookies = setCookie.parse(res, {
decodeValues: true // default: true
});
let lastSessionId = 'null';
cookies.forEach(element => {
if ( element.name === 'JSESSIONID' ) {
lastSessionId = element.value;
};
});
//console.log(cookies);
return resolve(lastSessionId);
})
.catch(error => {
console.error(error);
return reject(error);
});
});
}
что работает, но теперь я не знаю, как выполнить вторую команду для запуска заметки.
Я попытался предоставить файл cookie, как в:
const zeppelinNoteRun = async function(loginCookie){
return new Promise((resolve, reject) => {
const cookieHeader = `JSESSIONID=${loginCookie}; Path=/; HttpOnly`
axios
.post(process.env.ZEPPELIN_URL 'notebook/job/2G9P1992Z/20210615-091750_1582099873', {
headers:{
cookie: cookieHeader
}
})
.then(res => {
console.log(`statusCode: ${res.status}`);
return resolve(res);
})
.catch(error => {
console.error(error);
return reject(error);
});
});
}
Я не разбираюсь в Axios или файлах cookie, поэтому мне интересно знать, как выполнить такую задачу?
ИЗМЕНИТЬ: опечатка в URL-адресе в узле, хотя принятый ответ был окончательным решением.
Комментарии:
1. Я читал, что это работает только с браузерами. Но попробовал это сейчас, и я получаю
Error: Request failed with status code 405
Ответ №1:
Вы передали объект, содержащий файл cookie, в качестве данных POST. Попробуйте добавить значение null после 1-го аргумента axios.post
axios.post(url, null, {
headers:{
cookie: cookieHeader
}
})
подпись axios.post()
axios#post(url[, data[, config]])
Кстати, перезапись Cookie
заголовка на стороне браузера не будет работать по дизайну, независимо от того, используете ли вы собственную выборку или axios на стороне браузера, см. Имя запрещенного заголовка.
Комментарии:
1. Попробовал это, и теперь файл cookie там правильно, но я получаю 404, а
Cookie: 'JSESSIONID=c0017ad6-d120-46bc-8fd6-a54d0f0275c7; Path=/; HttpOnly', 'User-Agent': 'axios/0.21.1'
с завитком я получаюCookie: JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly
с —verbose ( другой экземпляр, поэтому другой файл cookie)2. @eemilk Не добавляйте информацию о пути в файл cookie, когда вы делаете запрос, используйте
cookie: 'a=1; b=2'
plz.3. Все еще 404. Я общался с
JSESSIONID=${loginCookie}
джастом иloginCookie
иJSESSIONID=${loginCookie}; HttpOnly
4. @eemilk полный журнал??
5. pastebin.com/ia96KZ1E <- full log in the pastebin site