首页 > 解决方案 > 尝试通过 PayPal API 上传文件但收到错误请求错误

问题描述

我试图通过 PayPal API ( https://developer.paypal.com/docs/api/customer-disputes/v1/ ) 上传证据文件。我成功通过 cURL 请求上传文件:

curl -v -X POST \
  -F 'file=@mao.pdf' \
  -F 'input={"evidences":[{"evidence_type": "OTHER", "evidence_info": {"tracking_info": [{"carrier_name": "FEDEX", "tracking_number": "123456789"}]}, "notes": "Test"}]};type=application/json' \
  -H 'Content-Type: multipart/related; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -H 'Authorization: Bearer xxxxxxxxxxxxxxx' \
  https://api.sandbox.paypal.com/v1/customer/disputes/PP-D-47363/provide-evidence

上面的 cURL 效果很好!但是当我将此 cURL 转换为常规获取请求时,我得到 400 - Bad Request 错误:

const body = new FormData();
body.append("file", fileBuffer, "@mao.pdf")
body.append("", "\\")
body.append("input", "{\"evidences\":[{\"evidence_type\": \"OTHER\", \"evidence_info\": {\"tracking_info\": [{\"carrier_name\": \"FEDEX\", \"tracking_number\": \"123456789\"}]}, \"notes\": \"Test\"}]};type=application/json")
body.append("", "\\")

fetch("https://api.sandbox.paypal.com/v1/customer/disputes/PP-D-47363/provide-evidence", {
  body,
  headers: {
    Authorization: `Bearer ${accessToken}`,
    "Content-Type": "multipart/related; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
  },
  method: "POST"
})
.then(response => console.log(response));

表单数据的日志:

FormData {
  _overheadLength: 457,
  _valueLength: 195,
  _valuesToMeasure: [],
  writable: false,
  readable: true,
  dataSize: 0,
  maxDataSize: 2097152,
  pauseStreams: true,
  _released: false,
  _streams: [
    '----------------------------315582696200967347353818\r\n' +
      'Content-Disposition: form-data; name="file"; filename="@mao.pdf"\r\n' +
      'Content-Type: application/pdf\r\n' +
      '\r\n',
    <Buffer 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d>,
    [Function: bound ],
    '----------------------------315582696200967347353818\r\n' +
      'Content-Disposition: form-data; name=""\r\n' +
      '\r\n',
    '\\',
    [Function: bound ],
    '----------------------------315582696200967347353818\r\n' +
      'Content-Disposition: form-data; name="input"\r\n' +
      '\r\n',
    '{"evidences":[{"evidence_type": "OTHER", "evidence_info": {"tracking_info": [{"carrier_name": "FEDEX", "tracking_number": "123456789"}]}, "notes": "Test"}]};type=application/json',
    [Function: bound ],
    '----------------------------315582696200967347353818\r\n' +
      'Content-Disposition: form-data; name=""\r\n' +
      '\r\n',
    '\\',
    [Function: bound ]
  ],
  _currentStream: null,
  _insideLoop: false,
  _pendingNext: false,
  _boundary: '--------------------------315582696200967347353818'
}

PayPal 响应的日志:

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      [Symbol(kCapture)]: false,
      [Symbol(kTransformState)]: [Object]
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'https://api.sandbox.paypal.com/v1/customer/disputes/PP-D-44006/provide-evidence',
    status: 400,
    statusText: 'Bad Request',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}

这个请求有什么问题?

标签: node.jspaypalfetchpaypal-sandboxpaypal-rest-sdk

解决方案


如果没有实际请求数据的日志和返回的实际错误,任何人都很难提供具体帮助,但最有可能的问题是未能为文件发送正确的元数据,或者它的顺序不正确(证据 JSON 对象然后文件)如 API 参考中所述。

有关如何使用文件元数据正确格式化多部分/请求帖子的文档和示例,请参阅RFC 2387


推荐阅读