Node.js使用request或form-data发送带自定义头的JSON POST请求问题求助
Node.js POST提交JSON数据解决方案
问题根因说明
- 你提供的curl请求是发送
application/json格式的payload,不需要用到form-data库,form-data仅用于multipart/form-data类型的请求(如文件上传、表单字段提交场景) - request库原生基于回调实现,不支持Promise,直接使用
await会无效;且你的传参格式不符合request库的要求,导致参数无法正确传递 - 使用form-data时直接替换了
getHeaders()的返回值,丢失了form-data必需的boundary标识,导致服务器无法解析请求体,出现携带自定义头就无数据的问题
方案1:使用request库(适配现有技术栈)
原生request不支持Promise,推荐使用promise封装的版本实现await调用:
- 安装依赖
npm install request request-promise-native - 实现代码
const rp = require('request-promise-native'); const requestOptions = { method: 'POST', url: 'https://personalsite.com/test.php', headers: { 'accept': 'text/html', 'SECRET-TOKEN-MESSAGE': 'dataforport', 'Cookie': 'PHPSESSID=1d2shuebo7lal8sn2itgppvfk4' }, body: { mobileno: '888888888', messagetext: 'Test message' }, // 开启json配置后会自动序列化body为JSON,自动设置Content-Type为application/json json: true }; try { const subscription = await rp(requestOptions); console.log('请求成功', subscription); } catch (error) { console.error('请求失败', error); }
方案2:form-data自定义头解决方法(仅适用于multipart/form-data请求场景)
如果确实需要使用form-data发送表单,自定义头需要和form-data生成的头合并,不能直接替换:
const FormData = require('form-data'); const rp = require('request-promise-native'); const bodyParams = new FormData(); bodyParams.append('mobileno', '888888888'); bodyParams.append('messagetext', 'Test message'); // 合并form内置头和自定义头,保留boundary信息 const headers = { ...bodyParams.getHeaders(), 'SECRET-TOKEN-MESSAGE': 'dataforport', 'accept': 'text/html', 'Cookie': 'PHPSESSID=1d2shuebo7lal8sn2itgppvfk4' }; const requestOptions = { method: 'POST', url: 'https://personalsite.com/test.php', headers: headers, formData: bodyParams }; const smsResponse = await rp(requestOptions);
更推荐的现代方案:使用axios
request库已经停止官方维护,更推荐使用原生支持Promise、配置更简单的axios:
- 安装依赖
npm install axios - 实现代码
const axios = require('axios'); try { const response = await axios.post('https://personalsite.com/test.php', { mobileno: '888888888', messagetext: 'Test message' }, { headers: { 'accept': 'text/html', 'SECRET-TOKEN-MESSAGE': 'dataforport', 'Cookie': 'PHPSESSID=1d2shuebo7lal8sn2itgppvfk4' } }); console.log('请求成功', response.data); } catch (error) { console.error('请求失败', error.response?.data || error.message); }
内容的提问来源于stack exchange,提问作者insoftservice
相关产品推荐
相关产品推荐

