Node.js使用Axios携带Cookie发起POST请求调用Zeppelin API方法
问题解决方法
你现有代码存在两个核心错误,修改后即可正常调用:
axios.post参数位置传错:Axios的POST方法参数顺序为请求URL、请求体、配置项,你把headers配置放到了本该传请求体的第二个参数位置,导致请求头根本没生效。执行笔记接口不需要额外传请求体,第二个参数填空对象即可。- Cookie请求头带了冗余属性:
Path=/和HttpOnly是服务端返回Set-Cookie响应头时的属性,客户端发起请求时不需要加,只需要传JSESSIONID的键值对即可。
修正后的代码
const zeppelinNoteRun = async function(loginCookie){ return new Promise((resolve, reject) => { const cookieHeader = `JSESSIONID=${loginCookie}` axios // 第二个参数是空请求体,第三个参数才是headers配置 .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); }); }); }
另外你可以先确认下process.env.ZEPPELIN_URL的配置是否包含/api/后缀,curl里的接口路径是/api/login和/api/notebook/...,如果配置的URL里没有/api/后缀,拼接后就会出现路径错误,需要补上。
更简洁的实现方案(无需手动解析Cookie)
你可以直接创建一个共享的Axios实例,开启withCredentials配置,实例会自动保存登录接口返回的Cookie,后续所有用该实例发起的请求都会自动携带Cookie,不需要你手动解析和拼接Cookie头:
const axios = require('axios') // 创建Zeppelin专用的axios实例 const zeppelinAxios = axios.create({ baseURL: process.env.ZEPPELIN_URL, withCredentials: true // 自动保存和携带Cookie }) // 登录方法 const zeppelinLogin = async function(){ await zeppelinAxios.post('login', 'userName=admin&password=admin') } // 执行笔记方法 const zeppelinNoteRun = async function(){ const res = await zeppelinAxios.post('notebook/job/2G9P1992Z/20210615-091750_1582099873') console.log(`statusCode: ${res.status}`) return res } // 调用示例 // ;(async () => { // await zeppelinLogin() // await zeppelinNoteRun() // })()
内容的提问来源于stack exchange,提问作者eemilk
相关产品推荐
相关产品推荐

