reactjs - 从反应发送带有授权标头的多部分/表单数据
问题描述
我正在尝试将带有表单数据的 POST 请求从 React 前端发送到 Go 后端。
const upload = () => {
let data = new FormData();
data.append('file', file);
data.append('namespace', namespace);
const requestOptions = {
headers: { 'Authorization': 'basic ' + props.getToken() },
method: 'POST',
body: data
};
fetch(`${process.env.REACT_APP_BACKEND_URL}/upload`, requestOptions)
.then(
response => alert(response.status)
).catch(
error => console.log(error)
);
};
在后端,我尝试通过以下方式访问数据:
func uploadHandler(w http.ResponseWriter, r *http.Request) {
// Read content
r.ParseMultipartForm(10 << 20)
file, fileHeader, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
}
fmt.Println(fileHeader)
var buf bytes.Buffer
io.Copy(&buf, file)
yamlData := buf.Bytes()
namespace := r.FormValue("namespace")
...
}
但是,我收到以下错误:
request Content-Type isn't multipart/form-data
此外,fileHeader 是nil
.
我找到的唯一可能的解决方案是删除本文中提到的标头,但是在 POST 正文中编码授权令牌当然不是我解决此问题的首选方法。
由于已经问过这个问题而且我不清楚这个问题:将标题设置为
headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'basic ' + props.getToken() }
导致同样的问题。
PS:React fetch 似乎会自动生成如下标头:
multipart/form-data; boundary=----WebKitFormBoundarykm4IEyyauWp42XvA
手动设置另一个标头时,提取 API 不会应用此标头。一个潜在的解决方案可能是组合标题,但我不知道这如何工作。
PPS:尝试相同的axios
方法会导致相同的问题。
axios({
method: 'POST',
url: `${process.env.REACT_APP_BACKEND_URL}/upload`,
data: data,
headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'basic ' + props.getToken() }
})
.then(
response => alert(response.status)
).catch(
error => console.log(error)
);
解决方案
我认为添加mode: "no-cors"
到您的requestOptions
意愿会有所帮助。这个库有一些奇怪的地方我想不通,即使显式发送Authorization
标头我也无法在后端看到它,因此您可能需要额外的配置来确保发送标头。
我测试了后端,它确实可以按预期工作(使用邮递员发送测试Content-Type
:multipart/form-data
和附件
推荐阅读
- javascript - 为什么当我在函数内部访问它时,我分配了数字输入标记的值的全局变量被解析为字符串?
- reactjs - 推入数组时使用 axios 返回数据导致异步问题
- python - 找不到表 dbstat
- spring-boot - 如何通过java程序清理redis缓存?
- angular7 - 如何在离子选择选项前添加国家标志图标?
- r - 为什么 readBin() 即使使用相同的参数也会返回不同的值?
- html - 如何在下一行对齐两个相同高度的div和第三个div
- java - 为什么我的数组列表不打印它的价值?
- c# - 如何将实例化对象与其原始对象匹配
- java - Hashmap 通过其他 hashmap 键返回值