rfc*_*484 6 curl http-content-length node.js fetch-api isomorphic-fetch-api
这是一个可以正常工作的CURL示例:
curl -X POST \
<url> \
-H 'authorization: Bearer <token>' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F file=@algorithm.jpg \
-F userId=<userId>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用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
})`
Run Code Online (Sandbox Code Playgroud)
我使用fs.readFileSync来生成file传递给FormData。
上一个示例返回401HTTP状态代码(未经授权),并显示一条错误消息,指出userId令牌中的嵌入内容(通过标头发送)与userId从中传递的不匹配formData。
因此,我怀疑FormData到达REST API的格式不正确。
该问题可能与Content-Length标头有关,但是我没有找到更好的方法来计算它(如果不使用Content-Length标头,则会丢失411HTTP状态代码Content-Length标头)。
可能是由于Content-Length标头中的值不正确而导致失败的情况?
还有其他关于为什么失败或如何更好地调试它的建议吗?
如果需要进一步的信息来解决此问题,请询问。
更新
我已经尝试过表单数据模块,以便Content-Length使用该方法获取正确的值formData.getLengthSync()
但是问题仍然存在(401错误的HTTP状态代码响应)。
如果您打开网络检查器,运行此代码片段,然后提交表单,您应该会看到Content-Length设置正确:
const foo = document.getElementById('foo')
foo.addEventListener('submit', (e) => {
e.preventDefault()
const formData = new FormData(foo)
formData.append('userId', 123)
fetch('//example.com', {
method: 'POST',
body: formData
})
})Run Code Online (Sandbox Code Playgroud)
<form id="foo">
<input id="file" type="file" name="file"/><br><br>
<button type="submit">Submit</button>
</form>Run Code Online (Sandbox Code Playgroud)

我的头撞在了类似的墙上,特别是isomorphic-fetch在节点上使用 POST 多部分表单。对我来说,关键是找到.getHeaders(). 请注意,NPM 的描述form-data表明它会在没有这个的情况下“正常工作”,但它似乎没有,至少在节点中没有(我认为浏览器会注入标头内容?)。
// image is a Buffer containing a PNG image
// auth is the authorization token
const form_data = new FormData();
form_data.append("image", png, {
filename: `image.png`,
contentType: 'application/octet-stream',
mimeType: 'application/octet-stream'
});
const headers = Object.assign({
'Accept': 'application/json',
'Authorization': auth,
}, form_data.getHeaders());
try {
const image_res = await fetch(url, {
method: 'POST',
headers: headers,
body: form_data
});
if (!image_res.ok) {
const out = await image_res.json();
console.dir(out);
return;
}
}
catch (e) {
console.error(`Chart image generation exception: ${e}`);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38757 次 |
| 最近记录: |