You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React中调用PUT接口更新供应商时出现400错误,请求数据格式/字段匹配问题求助

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."]

这次调整格式后出现的错误,主要有两个问题:

  • 字段大小写不匹配:后端模型的字段是IdNameRUCCODE(首字母大写或全大写),但你发送的是idnameruccode(全小写),后端模型绑定是区分大小写的,所以识别不到这些字段,才会报必填项错误。
  • 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.nombreeditedProveedor.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

火山引擎 最新活动