这是一个正常工作的CURL示例:
curl -X POST \
<url> \
-H 'authorization: Bearer <token>' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F file=@algorithm.jpg \
-F userId=<userId>
我正在尝试使用isomorphic-fetch来复制这个请求。
我尝试了以下代码:
const formData = new FormData();
formData.append('file', file);
formData.append('userId', userId);
return fetch(`<url>`, {
method: 'POST',
headers: {
'Content-Length': file.length
'Authorization: Bearer <authorization token>',
'Content-Type': 'multipart/form-data'
},
body: formData
})`
我使用fs.readFileSync
来生成传递给FormData
的file
。
前面的例子返回401
HTTP状态码(未经授权)和一个错误消息,说明通过标头发送的令牌中嵌入的userId
与从formData
传递的userId
不匹配。
因此,我的怀疑是到达REST API的FormData
格式不正确。
问题可能与Content-Length
标头有关,但我没有找到更好的计算方法(如果我不使用Content-Length
标头,则会收到一个411
HTTP状态代码Content-Length
标头缺失)。
这种情况可能是由于Content-Length
标头中的不正确值而导致失败吗?
其他关于为什么失败或如何更好地调试它的建议?
如果需要进一步信息以澄清此问题,请随时询问。
更新
我尝试了form-data模块,以使用方法formData.getLengthSync()
获取正确的Content-Length
值。
然而,问题仍然存在(401
错误HTTP状态码响应)。
Content-Type
请求头,因为这需要由浏览器自动生成以包含多部分边界。我认为如果你删除了这个和Content-Length
头,你就应该没问题了。 - idbeholdContent-Length
头部时,API
会返回一个411
错误的HTTP状态码:服务器拒绝接受没有定义Content-Length的请求
。 - rfc1484fetch
请求时Content-Length
标头似乎是必需的,但是当我通过CURL
执行相同的请求而没有这个标头时,一切都正常工作,并且不会返回411
错误 HTTP 状态码。 - rfc1484