node.js - 尝试通过 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
}
}
这个请求有什么问题?
解决方案
如果没有实际请求数据的日志和返回的实际错误,任何人都很难提供具体帮助,但最有可能的问题是未能为文件发送正确的元数据,或者它的顺序不正确(证据 JSON 对象然后文件)如 API 参考中所述。
有关如何使用文件元数据正确格式化多部分/请求帖子的文档和示例,请参阅RFC 2387
推荐阅读
- php - 使用 Puppeteer 下载 pdf 时获取 Symfony\Component\Process\Exception\ProcessFailedException
- android - 使用 Jitsi Sdk 和 quickblox-android-sdk 时重复类 org.webrtc.AndroidVideoDecoder
- java - Spring RestTemplate 在 Spring Boot 控制台应用程序中使用时会超时
- elasticsearch - 如何在单个节点上运行多个 Elasticsearch 实例
- .net - 在本地时区将 JSON 字符串反序列化为 .NET DateTime 会增加两个小时
- html - 网格布局css中的按钮
- android - 尽管已在 Google Play 控制台中定义,但在代码中未找到 Android 订阅/购买
- reactjs - 如何在 mapStateToProps 中使用 useParams?
- swift - Xcode 在运行测试时出现“找不到图像”
- python - 如何将字符串划分为列表中的子字符串列表,但保持数字字符串完整 - Python?