收藏
回答

公众号开发 调用【上传图文消息内的图片获取URL】接口时,返回 412 错误?

我使用 NodeJS 开发,Express 为框架,在调用微信提供的 【上传图文消息内的图片获取URL】 接口时,axios 报错为 Error: Request failed with status code 412,我不清楚我是哪里做的不对。接口说明必须要用 form表单的形式发送,但是 node 并没有前端的 formData 类,我使用了 form-data 这个 npm 包,通过它来实现此功能,http 请求代理我使用的是 axios,相关代码如下,希望能帮助我解决这个问题, 谢谢!

const SWAP_IMAGE_URL = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg';
let form = new FormData();
form.append("media", fs.createReadStream("./hello.jpg"));
let token = await getAccessToken(app_id);
let config = {
  params: { access_token: token.message },
  headers: form.getHeaders()
};
let result = await axios.post(SWAP_IMAGE_URL, form, config); 
console.log(result);
// 我十分确定 URL 和 access_token 都是正常有效的, 请求的头部 content-type 为 multipart/form-data

报错的信息如下:

message: Error: Request failed with status code 412
      at createError (E:\Desktop\WeChat\Develop\myapp\node_modules\axios\lib\core\createError.js:16:15)
      at settle (E:\Desktop\WeChat\Develop\myapp\node_modules\axios\lib\core\settle.js:17:12)
      at IncomingMessage.handleStreamEnd (E:\Desktop\WeChat\Develop\myapp\node_modules\axios\lib\adapters\http.js:236:11)  
      at IncomingMessage.emit (events.js:228:7)
      at endReadableNT (_stream_readable.js:1185:12)
      at processTicksAndRejections (internal/process/task_queues.js:81:21) {
    config: {
      url: 'https://api.weixin.qq.com/cgi-bin/media/uploadimg',
      method: 'post',
      params: [Object],
      data: [FormData],
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      adapter: [Function: httpAdapter],
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      validateStatus: [Function: validateStatus]
    },
    request: ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 6,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      _last: true,
      chunkedEncoding: true,
      shouldKeepAlive: false,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: null,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      connection: [TLSSocket],
      _header: 'POST /cgi-bin/media/uploadimg?access_token=30_EXkR_41Gro2UV5C6WXucnrGcIadJ_KW75FyneOzXKv_SHwtk7RWv91pvMNIfg_M4GcR0PHZDQitEFeDPrn4t09y_6SP5C2qjm5PNSUTBFTgxyPjtkcdsetGHSlwSABeAAAMUV HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Content-Type: multipart/form-data; boundary=--------------------------115632283931134332760190\r\n' +
        'User-Agent: axios/0.19.2\r\n' +
        'Host: api.weixin.qq.com\r\n' +
        'Connection: close\r\n' +
        'Transfer-Encoding: chunked\r\n' +
        '\r\n',
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      path: '/cgi-bin/media/uploadimg?access_token=30_EXkR_41Gro2UV5C6WXucnrGcIadJ_KW75FyneOzXKv_SHwtk7RWv91pvMNIfg_M4GcR0PHZDQitEFeDPrn4t09y_6SP5C2qjm5PNSUTBFTgxyPjtkcdsetGHSlwSABeAAAMUV',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      _redirectable: [Writable],
      [Symbol(kNeedDrain)]: true,
      [Symbol(isCorked)]: false,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    response: {
      [Symbol(isCorked)]: false,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    response: {
      status: 412,
      statusText: 'Precondition Failed',
      headers: [Object],
      config: [Object],
      request: [ClientRequest],
      data: ''
    },
    isAxiosError: true,
    toJSON: [Function]
  }

大概是因为 fs.createReadStream 这里的原因, 但是我想不到更好的办法了, 不清楚怎么办

回答关注问题邀请回答
收藏

2 个回答

  • Mr.Zhao
    Mr.Zhao
    2020-02-05

    2020-02-05
    有用 1
    回复 4
    • 2020-02-06
      感谢感谢! 好人百毒不侵!
      2020-02-06
      回复
    • C.X
      C.X
      2020-03-08
      我和楼主一样的情况,我自己鼓捣了一天,发现axios+formdata请求自己的接口一切正常,换微信后台的就报和楼主一样的错误,request请求自己接口和微信后台都正常。希望能帮忙解答下是怎么回事
      2020-03-08
      回复
    • 李🐶嗨
      李🐶嗨
      2020-04-12
      试下request,搞了一上午
      2020-04-12
      回复
    • 李🐶嗨
      李🐶嗨
      2020-04-12
      谢谢了,这个可以的,用axios,一直都不行
      2020-04-12
      回复
  • das parfum
    das parfum
    2020-08-19

    我也遇到这个问题了,后来看了 “停止吃东西”的留言,使用 request 库请求后就正常了,翻阅axios文档,发现,在 axios 在 浏览器端专属支持 FormData,所以用axios怎么请求都报412

    https://www.kancloud.cn/yunye/axios/234845

    2020-08-19
    有用
    回复
登录 后发表内容
问题标签