Strapi POST请求无multipart数据却要求该格式,已开CREATE权限仍报错如何处理?
问题:Strapi POST调用要求使用Multi-Part请求的问题排查
为什么Strapi的POST调用总是要求使用Multi-Part请求?我使用的特定内容类型不存在multipart类型的数据。
我已经在Strapi CMS管理后台的「Roles & permission(角色与权限)」板块,为对应接口开启了CREATE权限。
提交的Post数据:
返回的响应结果:
前端调用代码如下:
import React, { useState } from 'react' export default () => { const [description, setDescription] = useState('') const handleSubmit = async (event) => { event.preventDefault(); const data = await fetch('http://localhost:1337/posts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ description }) }) const response = await data.json(); console.log(response) } return ( <div className="Create"> <form onSubmit={handleSubmit}> <input type="text" placeholder="Description" value={description} onChange={(event) => { setDescription(event.target.value) }} /> <button>Submit</button> </form> </div> ) }
按上述方式调用接口出现报错,请问该如何排查和解决这个问题?
解决方法
Strapi本身完全支持application/json格式的POST请求,不需要强制使用multipart格式,出现要求multipart的报错,绝大多数是请求体结构不符合Strapi的接口规范导致的,按以下步骤排查即可:
- 修正请求体结构(核心问题)
Strapi v4的RESTful创建/更新接口要求所有业务字段必须嵌套在data属性下,你当前的代码直接把description放在请求体根节点,Strapi解析不到有效业务数据,就会误判为你要上传二进制文件,提示要求multipart格式。
把请求的body部分修改为如下结构即可:
body: JSON.stringify({ data: { description } })
- 辅助排查项
如果修改结构后依然报错,再检查以下配置:- 确认内容类型的字段名拼写完全一致,比如不要把小写的
description写成大写Description - 确认该内容类型没有其他必填字段未传,缺失必填字段也可能触发解析错误
- 如果你没有给Public角色开放CREATE权限,需要在请求头中添加
Authorization: Bearer <你的用户token>字段 - 可以先用API调试工具直接向接口发送符合结构的JSON请求,先确认接口本身可以正常调用,再排查前端代码问题。
- 确认内容类型的字段名拼写完全一致,比如不要把小写的
修改后不需要调整Content-Type,保持application/json即可正常调用。
内容的提问来源于stack exchange,提问作者Plutus
相关产品推荐
相关产品推荐

