1

I don't see what's failing in the code; I want to consume a Put method, but when I do, the response returned by the API is:

"errors": {
    "$": [
        "The JSON value could not be converted to MTE.API.Request.Supplier.PutSupplierRequest. Path: $ | LineNumber: 0 | BytePositionInLine: 2."
    ],
    "request": [
        "The request field is required."
    ]
}

What I'm trying to achieve is that, visualizing a series of data in a table, I can edit the information from a modal. I think the problem is precisely there, but I have no idea why. The other methods works well (get, post and delete).

I structured the request like this:
For more context: I have a const to define the url: http://api.com/api/suplier

 actualizarProveedor: async (proveedorData) => {
    try {
      const response = await axios.put(`${API_BASE_URL}`, proveedorData, {
        headers: {
          'Content-Type': 'application/json',
        },
      });
  
      console.log('Actualizar Proveedor:', response.data);
      return response.data;
    } catch (error) {
      console.error('Error en actualizarProveedor:', error);
      throw error;
    }
  },

And this is how the data is sent to the request:

const handleGuardarEdicion = async (editedProveedor) => {
    try {
      await apiCompras.actualizarProveedor(editedProveedor.id, {
        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);
    }
  };

Finally, this is how the modal is constructed:

<Dialog open={modalOpen} onClose={handleCloseModal}>
  <DialogTitle>Editar Proveedor</DialogTitle>
  <DialogContent>
    <form>
      <TextField
        label="Nombre"
        variant="outlined"
        margin="normal"
        fullWidth
        required
        value={selectedProveedor ? selectedProveedor.name : ''}
        onChange={(e) => handleEditFieldChange('name', e.target.value)}
      />
      <TextField
        label="Código RUC"
        variant="outlined"
        margin="normal"
        fullWidth
        required
        value={selectedProveedor ? selectedProveedor.ruccode : ''}
        onChange={(e) => handleEditFieldChange('ruccode', e.target.value)}
      />
    </form>
  </DialogContent>
  <DialogActions>
    <Button onClick={() => { handleGuardarEdicion(selectedProveedor); handleCloseModal(); }} color="primary">
      Cerrar
    </Button>
  </DialogActions>
</Dialog>

I've made changes that have altered the error message to this:

"errors": {
    "Id": [
        "The field Id must be between 1 and 2147483647."
    ],
    "Name": [
        "The Name field is required."
    ],
    "RUCCODE": [
        "The RUCCODE field is required."
    ]
}

Adding this to the request:

try {
  const requestData = {
    request: {
      id: supplierData.id,
      name: supplierData.name,
      ruccode: supplierData.ruccode,
    }
  };
3
  • You're sending two arguments to actualizarProveedor(), yet its signature only accepts one. I assume the object in the second argument is the data you're intending to send, so it's being ignored. Commented Jan 10, 2024 at 16:01
  • 1
    @RoryMcCrossan thank you, that was quite helpful. You were correct about it. The request sent its own "structure" but empty, I deleted that and it worked. Commented Jan 10, 2024 at 19:08
  • Glad it helped. I added it as an answer for you. Commented Jan 10, 2024 at 19:20

1 Answer 1

0

You're sending two arguments to actualizarProveedor() yet its signature only accepts one. I assume the object in the second argument is the data you're intending to send, so it's being ignored.

To fix the issue you can amend the invocation to pass the object only:

await apiCompras.actualizarProveedor({
  id: editedProveedor.id,
  name: editedProveedor.nombre,
  ruccode: editedProveedor.numeroRUC,
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.