繁体   English   中英

无法在 Nodejs 中使用 axios 发送表单数据?

[英]Not able to send form data using axios in Nodejs?

我正在尝试使用 axios 发出 POST 请求,但收到 400 错误请求错误消息。 我在 POSTMAN 中尝试了相同的请求,但它工作正常知道我缺少什么吗? 代码:

const TWITTER_UPLOAD_MEDIA_BASE_URL = 'https://upload.twitter.com/1.1/media/upload.json';
 
const url = "https://ik.imagekit.io/XXXXXXXXXXXX/test-upload_XXXXXXXXXXX.png";
 
const { data } = await axios.get(url);
const form = new FormData();
form.append('media', data);
 
const token = {
    key: oauth_access_token,
    secret: oauth_access_token_secret
};
 
const oauth = OAuth({
    consumer: {
        key: process.env.TWITTER_CONSUMER_KEY,
        secret: process.env.TWITTER_CONSUMER_SECRET
    },
    signature_method: 'HMAC-SHA1',
    hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64')
});
 
const authHeader = oauth.toHeader(oauth.authorize({
    url: `${TWITTER_UPLOAD_MEDIA_BASE_URL}?media_category=tweet_image`,
    method: 'POST'
}, token));
 
const result = await axios.post(`${TWITTER_UPLOAD_MEDIA_BASE_URL}?media_category=tweet_image`, form, {
    headers: {
        Authorization: authHeader["Authorization"],
        'Content-type': "multipart/form-data",
        "Content-Transfer-Encoding": "base64"
    }
});

我也试过:

 
const url = "https://ik.imagekit.io/XXXXXXXXXXXX/test-upload_XXXXXXXXXXX.png";
 
const image = await axios.get(url, { responseType: 'arraybuffer' });
const raw = new Buffer.from(image.data).toString('base64');
const base64Image = "data:" + image.headers["content-type"] + ";base64," + raw;
 
const token = {
    key: oauth_access_token,
    secret: oauth_access_token_secret
};
 
const oauth = OAuth({
    consumer: {
        key: process.env.TWITTER_CONSUMER_KEY,
        secret: process.env.TWITTER_CONSUMER_SECRET
    },
    signature_method: 'HMAC-SHA1',
    hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64')
});
 
const authHeader = oauth.toHeader(oauth.authorize({
    url: `${TWITTER_UPLOAD_MEDIA_BASE_URL}?media_category=tweet_image`,
    method: 'POST'
}, token));
 
const result = await axios.post(`${TWITTER_UPLOAD_MEDIA_BASE_URL}?media_category=tweet_image`, {media_data: base64Image}, {
    headers: {
        Authorization: authHeader["Authorization"],
        'Content-type': "multipart/form-data",
        "Content-Transfer-Encoding": "base64"
    }
});

机器人片段不起作用。 直到第 27 行(第一个代码片段),一切都是正确的。 问题来自第 28 行 axios 和表单内容 POSTMAN 成功请求的屏幕截图: 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我认为 axios 有一些严重的问题:

  1. https://github.com/mzabriskie/axios/issues/789

  2. https://github.com/axios/axios/issues/1006

  3. https://developer.twitter.com/en/docs/twitter-api/v1/media/upload-media/api-reference/post-media-upload

  4. Twitter 媒体上传指南: https://developer.twitter.com/en/docs/twitter-api/v1/media/upload-practic/uploading-media

首先下载您的图像,例如:

const url = 'https://url-to-your-image'
const { data } = await axios.get(url, {
      responseType: 'stream',
})

之后你可以 append 直接在formdata中的图像

const formData = new FormData()
formData.append('media', stream)

最后上传

const result = await axios.post(`${TWITTER_UPLOAD_MEDIA_BASE_URL}? 
media_category=tweet_image`, formData, {
   headers: {
    Authorization: authHeader["Authorization"],
    'Content-type': "multipart/form-data",
    "Content-Transfer-Encoding": "base64"
   }
});

如果您仍然遇到问题,请告诉我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM