Axios – ¿ELIMINAR solicitud con cuerpo de solicitud y encabezados?

4 minutos de lectura

Avatar de usuario de Asfourhundred
como cuatrocientos

Estoy usando Axios mientras programo en ReactJS y pretendo enviar una solicitud de ELIMINACIÓN a mi servidor.

Para hacerlo necesito los encabezados:

headers: {
  'Authorization': ...
}

y el cuerpo esta compuesto

var payload = {
    "username": ..
}

He estado buscando en Internet y solo encontré que el método DELETE requiere un “parámetro” y no acepta “datos”.

He estado tratando de enviarlo así:

axios.delete(URL, payload, header);

o incluso

axios.delete(URL, {params: payload}, header);

Pero nada parece funcionar…

¿Alguien puede decirme si es posible (supongo que lo es) enviar una solicitud de ELIMINACIÓN con encabezados y cuerpo y cómo hacerlo?

¡Gracias de antemano!

avatar de usuario de vishu2124
vishu2124

Entonces, después de varios intentos, encontré que funcionaba.

Siga la secuencia del pedido. es muy importante de lo contrario no funcionará

axios.delete(URL, {
  headers: {
    Authorization: authorizationToken
  },
  data: {
    source: source
  }
});

  • Hola, ¿puedes explicar por qué funciona tu respuesta?

    – Franco Gil

    6 de enero de 2021 a las 17:15

  • posiblemente porque DELETE no debe tener cuerpos de solicitud. Tal vez haya algo ahí que lo impida (como debería)

    – Siempre

    16 de febrero de 2021 a las 6:33

  • @Evert eso es incorrecto, las solicitudes DELETE tienen semántica no definida para el cuerpo, por lo que puede tener el cuerpo de la solicitud, pero las implementaciones antiguas pueden rechazar la solicitud. En mi opinión, debe tener el cuerpo de la solicitud y dejar obsoletos a los clientes antiguos y rotar nuevos clientes en su lugar.

    – Víctor Pudeyev

    3 de junio de 2021 a las 16:08

  • @VictorPudeyev oye, entiendo que el lenguaje en la especificación HTTP es confuso. si un cuerpo mayo aparecer, pero debería tener algún significado para el servidor. Por lo tanto, nunca hay una buena razón para agregar un cuerpo a un cuerpo HTTP DELETE. Entonces puedes agregar un cuerpo, pero no tiene sentido.

    – Siempre

    3 de junio de 2021 a las 17:11

  • Así que mi comentario original es correcto. De hecho, este es un párrafo de la próxima especificación HTTP que hace eco de esto: “Un cliente NO DEBE generar contenido en una solicitud DELETE. El contenido recibido en una solicitud DELETE no tiene una semántica definida, no puede alterar el significado o el objetivo de la solicitud y podría llevar a algunas implementaciones a rechazar la solicitud”.

    – Siempre

    3 de junio de 2021 a las 17:29

avatar de usuario de tarzen chugh
tarzen chugh

axios.delete admite tanto el cuerpo de la solicitud como los encabezados.

Acepta dos parámetros: url y configuración opcional. Puedes usar config.data para establecer el cuerpo de la solicitud y los encabezados de la siguiente manera:

axios.delete(url, { data: { foo: "bar" }, headers: { "Authorization": "***" } });

Mira aquí – https://github.com/axios/axios/issues/897

  • El caso es que quiero enviar un cuerpo y encabezados en la misma solicitud de eliminación

    – Como cuatrocientos

    28 de junio de 2018 a las 17:55

Avatar de usuario de Van_Paitin
Van_Paitin

Aquí hay un breve resumen de los formatos requeridos para enviar varios verbos http con axios:

  • GET: Dos caminos

    • primer método

      axios.get('/user?ID=12345')
        .then(function (response) {
          // Do something
        })
      
    • Segundo método

      axios.get('/user', {
          params: {
            ID: 12345
          }
        })
        .then(function (response) {
          // Do something
        })
      

    Los dos anteriores son equivalentes. Observar la params palabra clave en el segundo método.

  • POST y PATCH

    axios.post('any-url', payload).then(
      // payload is the body of the request
      // Do something
    )
    
    axios.patch('any-url', payload).then(
      // payload is the body of the request
      // Do something
    )
    
  • DELETE

    axios.delete('url', { data: payload }).then(
      // Observe the data keyword this time. Very important
      // payload is the request body
      // Do something
    )
    

Puntos clave

  • get las solicitudes necesitan opcionalmente un params clave para establecer correctamente los parámetros de consulta
  • delete las solicitudes con un cuerpo necesitan que se establezca bajo un data llave

  • Su respuesta me hace desear que haya una función de voto a favor de +2 en el desbordamiento de pila.

    – eli-bd

    19 de febrero de 2019 a las 6:52

  • Esta es la única respuesta que lo explica en detalle. Gracias, realmente ayudó a entender incluso a otros.

    – Geoff

    4 de marzo de 2020 a las 10:45

  • ¿Cómo enviar una solicitud de eliminación con parámetros, no cuerpo?

    – Ajay Singh

    30 de junio de 2020 a las 12:46


  • La mejor respuesta a esta pregunta. Gracias.

    – Hartley San

    6 de julio de 2020 a las 1:38

  • @MaFiA, si desea enviar una solicitud de eliminación con params. Simplemente puede ponerlo en la URL usando cadenas de consulta

    – Van_Paitin

    25 de agosto de 2020 a las 17:57

axios.Eliminar es pasó una url y una configuración opcional.

axios.delete(url[, config])

Los campos disponible para la configuración puede incluir los encabezados.

Esto hace que la llamada a la API se pueda escribir como:

const headers = {
  'Authorization': 'Bearer paperboy'
}
const data = {
  foo: 'bar'
}

axios.delete('https://foo.svc/resource', {headers, data})

avatar de usuario de x4wiz
x4wiz

Para aquellos que probaron todo lo anterior y aún no ven la carga útil con la solicitud, asegúrese de tener:

"axios": "^0.21.1" (not 0.20.0)

Entonces, las soluciones anteriores funcionan.

axios.delete("URL", {
      headers: {
        Authorization: `Bearer ${token}`,
      },
      data: {
        var1: "var1",
        var2: "var2"
      },
    })

Puede acceder a la carga útil con

req.body.var1, req.body.var2

Aquí está el problema:

https://github.com/axios/axios/issues/3335

Para eliminar, deberá hacer lo siguiente

axios.delete("/<your endpoint>", { data:<"payload object">})

Funcionó para mí.

avatar de usuario de ronara
ronara

Tuve el mismo problema, lo resolví así:

axios.delete(url, {data:{username:"user", password:"pass"}, headers:{Authorization: "token"}})

¿Ha sido útil esta solución?