React中调用PUT接口更新供应商时出现400错误,请求数据格式/字段匹配问题求助
看起来你遇到了前端PUT请求和后端模型不匹配的典型问题,我帮你一步步拆解问题所在和解决方向:
先梳理下你遇到的两次错误根源
第一次错误的核心原因
"The JSON value could not be converted to MTE.API.Request.Supplier.PutSupplierRequest. Path: $ | LineNumber: 0 | BytePositionInLine: 2."
"The request field is required."
这说明后端定义的PutSupplierRequest模型,要求请求体必须是一个包含request字段的嵌套对象,但你最开始直接把供应商数据平铺发送了,没有包裹在request字段里,导致后端无法解析你的请求。
第二次错误的核心原因
"Id": ["The field Id must be between 1 and 2147483647."]
"Name": ["The Name field is required."]
"RUCCODE": ["The RUCCODE field is required."]
这次调整格式后出现的错误,主要有两个问题:
- 字段大小写不匹配:后端模型的字段是
Id、Name、RUCCODE(首字母大写或全大写),但你发送的是id、name、ruccode(全小写),后端模型绑定是区分大小写的,所以识别不到这些字段,才会报必填项错误。 - Id值有效性问题:你传入的
editedProveedor.id可能不是合法的正整数(比如是空字符串、0,或者超出了后端允许的数值范围)。
具体修正步骤
1. 修正请求数据的格式和字段大小写
按照后端模型要求,把数据包裹在request里,同时对齐字段的大小写:
// 在actualizarProveedor函数里构造正确的请求体 const requestData = { request: { Id: proveedorData.id, // 对应后端的Id字段 Name: proveedorData.name, // 对应后端的Name字段 RUCCODE: proveedorData.ruccode // 对应后端的RUCCODE字段 } }; // 然后用这个requestData发起请求 const response = await axios.put(`${API_BASE_URL}`, requestData, { headers: { 'Content-Type': 'application/json', }, });
2. 修正API调用的参数传递
你之前调用actualizarProveedor时传了两个参数(editedProveedor.id和一个对象),但你的函数定义只接收一个proveedorData参数,这会导致第一个参数覆盖了请求数据,第二个参数被忽略。要改成只传正确格式的对象:
const handleGuardarEdicion = async (editedProveedor) => { // 先校验Id是否合法 if (!editedProveedor.id || editedProveedor.id < 1 || editedProveedor.id > 2147483647) { console.error("Id格式不正确,必须是1到2147483647之间的整数"); return; } try { // 直接传递包含正确字段的对象 await apiCompras.actualizarProveedor({ id: editedProveedor.id, name: editedProveedor.nombre, // 注意这里要和你状态里的字段名对应! ruccode: editedProveedor.numeroRUC // 同样要对齐状态里的字段名 }); console.log('Proveedor actualizado exitosamente:', editedProveedor); cargarProveedores(); } catch (error) { console.error('Error al actualizar proveedor:', error); } };
3. 统一状态字段名避免传空值
看你的Modal里,handleEditFieldChange用的是'name'和'ruccode'来更新状态,但调用时用的是editedProveedor.nombre和editedProveedor.numeroRUC,这里字段名不一致,很可能导致你传了空值给后端。要统一字段名:
比如把Modal里的onChange改成对应状态里的字段:
<TextField label="Nombre" variant="outlined" margin="normal" fullWidth required value={selectedProveedor ? selectedProveedor.nombre : ''} onChange={(e) => handleEditFieldChange('nombre', e.target.value)} /> <TextField label="Código RUC" variant="outlined" margin="normal" fullWidth required value={selectedProveedor ? selectedProveedor.numeroRUC : ''} onChange={(e) => handleEditFieldChange('numeroRUC', e.target.value)} />
总结一下,核心问题就是请求体格式不符合后端模型要求、字段大小写不匹配、API调用参数传错,还有状态字段名不一致导致的空值传递,把这些点修正后应该就能解决400错误了。
备注:内容来源于stack exchange,提问作者Nery




