Axios Удалить запрос с телом и заголовками?

Я использую Axios при программировании в ReactJS и делаю вид, что отправляю запрос DELETE на свой сервер.

Для этого мне нужны заголовки:

headers: {
  'Authorization': ...
}

и тело состоит из

var payload = {
    "username": ..
}

Я искал в интервалах и только обнаружил, что метод DELETE требует «param» и не принимает «data».

Пытался отправить вот так:

axios.delete(URL, payload, header);

или даже

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

Но вроде ничего не работает ...

Может ли кто-нибудь сказать мне, возможно ли (я предполагаю, что это возможно) отправить запрос DELETE с заголовками и телом и как это сделать?

Заранее спасибо!


person Asfourhundred    schedule 27.06.2018    source источник


Ответы (14)


Итак, после нескольких попыток я обнаружил, что это работает.

Следуйте порядку заказа, это очень важно, иначе ничего не получится.

axios.delete(URL, {
  headers: {
    Authorization: authorizationToken
  },
  data: {
    source: source
  }
});
person vishu2124    schedule 19.05.2019
comment
Здравствуйте, вы можете объяснить, почему ваш ответ работает? - person Franco Gil; 06.01.2021
comment
Возможно потому, что DELETE не должно иметь тел запросов. Может там что-то мешает (как и должно) - person Evert; 16.02.2021
comment
@Evert неверно, запросы DELETE имеют не определенную семантику для тела, поэтому вы можете иметь тело запроса, но старые реализации могут отклонить запрос. ИМО, у вас должно быть тело запроса и устаревшие старые клиенты и ротация новых клиентов на их месте. - person Victor Pudeyev; 03.06.2021
comment
@VictorPudeyev, я понимаю, что язык в спецификации HTTP сбивает с толку. Да, тело может появиться, но оно должно иметь какое-то значение для сервера. Таким образом, нет веских причин для добавления тела в тело HTTP DELETE. Так что можно добавить тело, но это бессмысленно. - person Evert; 03.06.2021
comment
Итак, мой первоначальный комментарий верен. Фактически, это абзац из предстоящей спецификации HTTP, который повторяет следующее: клиент НЕ ДОЛЖЕН генерировать контент в запросе DELETE. Содержимое, полученное в запросе DELETE, не имеет определенной семантики, не может изменить значение или цель запроса и может привести к тому, что некоторые реализации отклонят запрос. - person Evert; 03.06.2021
comment
@VictorPudeyev Отказ от ответственности, я помогал писать это. Ссылка: httpwg.org/http-core/ - person Evert; 03.06.2021
comment
@Evert отметил, спасибо - person Victor Pudeyev; 04.06.2021

axios.delete поддерживает тело запроса. Он принимает два параметра: url и необязательный config. Вы можете использовать config.data для установки тела запроса и заголовков следующим образом:

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

См. Здесь - https://github.com/axios/axios/issues/897

person tarzen chugh    schedule 27.06.2018
comment
Дело в том, что я хочу отправить тело и заголовки в одном запросе на удаление - person Asfourhundred; 28.06.2018

Вот краткое описание форматов, необходимых для отправки различных http-глаголов с аксиомами:

  • GET: Два пути

    • Первый способ

      axios.get('/user?ID=12345')
        .then(function (response) {
          // Do something
        })
      
    • Второй способ

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

    Два приведенных выше эквивалента. Обратите внимание на ключевое слово params во втором методе.

  • POST и 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
    )
    

Ключевые выводы

  • get запросам необязательно нужен params ключ для правильной установки параметров запроса
  • delete запросы с телом должны быть заданы под ключом data
person Van_Paitin    schedule 12.11.2018
comment
Ваш ответ заставляет меня пожелать, чтобы при переполнении стека была функция +2 голоса. - person eli-bd; 19.02.2019
comment
Это единственный ответ, который подробно объясняет это. Спасибо, это действительно помогло понять даже другим. - person Geoff; 04.03.2020
comment
Как отправить запрос на удаление с параметрами, а не с телом? - person Ajay Singh; 30.06.2020
comment
Лучший ответ на этот вопрос. Спасибо. - person HartleySan; 06.07.2020
comment
@MaFiA, если вы хотите отправить запрос на удаление с параметрами. Вы можете просто поместить его в URL-адрес, используя строки запроса - person Van_Paitin; 25.08.2020
comment
Отличное объяснение, избавившее меня от потенциальной головной боли. Спасибо! - person Nimsrules; 01.09.2020
comment
Я не могу заставить это работать. Отправка axios.delete('some-url',{data: someObj}) отправляет сообщение DELETE без тела. - person geoidesic; 22.11.2020
comment
someObj, вероятно, равен нулю или не определен. Убедитесь, что никто не редактировал someObj перед отправкой запроса - person Van_Paitin; 23.11.2020
comment
Он не работает, я отправляю {data: payload} для удаления, но он все равно не отправляет тело запроса - person Amar Shakya; 29.12.2020
comment
есть идеи, как это работает для nuxt axios? \ - person Amar Shakya; 29.12.2020

axios. delete - это переданный URL-адрес и необязательная конфигурация.

axios.delete (URL [, конфигурация])

Поля, , доступные для конфигурации, могут включать заголовки.

Это делает так, что вызов API может быть записан как:

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

axios.delete('https://foo.svc/resource', {headers, data})
person Oluwafemi Sule    schedule 27.06.2018
comment
У меня это не работает ... У меня const headers = {'Authorization': ...} и data = {'username': ...} заканчиваются на axios.delete('http://...', {headers, data}), но сервер не может получить доступ к заголовкам ... - person Asfourhundred; 28.06.2018
comment
Запрос, исходящий из браузера, говорит о другом. См. Этот Stackblitz (stackblitz.com/edit/react-gq1maa), а также запрос в вкладка сети браузера (snag.gy/JrAMjD.jpg). Здесь вы должны быть уверены, что правильно читаете серверную часть заголовков или что запрос не перехвачен и не подделан. - person Oluwafemi Sule; 30.06.2018
comment
работал у меня, я использую React и Django - person Harshit Gangwar; 02.02.2021

Для удаления вам нужно будет сделать следующее

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

У меня это сработало.

person Hemantkumar Gaikwad    schedule 27.02.2019

У меня была такая же проблема, которую я решил вот так:

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

Фактически axios.delete поддерживает тело запроса.
Он принимает два параметра: URL и необязательный config. То есть...

axios.delete(url: string, config?: AxiosRequestConfig | undefined)

Вы можете сделать следующее, чтобы задать тело ответа для запроса на удаление:

let config = { 
    headers: {
        Authorization: authToken
    },
    data: { //! Take note of the `data` keyword. This is the request body.
        key: value,
        ... //! more `key: value` pairs as desired.
    } 
}

axios.delete(url, config)

Я надеюсь, что это помогает кому-то!

person ThunderBird    schedule 06.05.2020
comment
Спасибо, я использую это в моем методе удаления nestJs HttpService как: this.httpService.delete (apiUrl, {headers: headersRequest, data: deleteBody}) - person shanti; 16.07.2020

Для тех, кто пробовал все вышеописанное и до сих пор не видит полезную нагрузку с запросом - убедитесь, что у вас есть:

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

Затем приведенные выше решения работают

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

Вы можете получить доступ к полезной нагрузке с помощью

req.body.var1, req.body.var2

Вот в чем проблема:

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

person x4wiz    schedule 14.02.2021

Чтобы отправить HTTP DELETE с некоторыми заголовками через axios, я сделал следующее:

  const deleteUrl = "http//foo.bar.baz";
  const httpReqHeaders = {
    'Authorization': token,
    'Content-Type': 'application/json'
  };
  // check the structure here: https://github.com/axios/axios#request-config
  const axiosConfigObject = {headers: httpReqHeaders}; 

  axios.delete(deleteUrl, axiosConfigObject);

Синтаксис axios для разных HTTP-глаголов (GET, POST, PUT, DELETE) сложен, потому что иногда второй параметр должен быть телом HTTP, а иногда (когда он может не понадобиться) вы просто передаете заголовки как второй параметр.

Однако предположим, что вам нужно отправить запрос HTTP POST без тела HTTP, тогда вам нужно передать undefined в качестве второго параметра.

Помните, что согласно определению объекта конфигурации (https://github.com/axios/axios#request-config) вы по-прежнему можете передавать тело HTTP в HTTP-вызове через поле data при вызове axios.delete, однако для команды HTTP DELETE он будет проигнорирован.

Эта путаница между вторым параметром, который иногда является телом HTTP, а иногда и целым объектом config для axios, связана с тем, как были реализованы правила HTTP. Иногда тело HTTP не требуется для того, чтобы HTTP-вызов считался действительным.

person TPPZ    schedule 08.10.2018

Я нашел способ, который работает:

axios
      .delete(URL, {
        params: { id: 'IDDataBase'},
        headers: {
          token: 'TOKEN',
        },
      }) 
      .then(function (response) {
        
      })
      .catch(function (error) {
        console.log(error);
      });

Я надеюсь, что это сработает и для вас.

person Damian Guilisasti    schedule 06.10.2020

Если у нас есть:

myData = { field1: val1, field2: val2 }

Мы могли бы преобразовать данные (JSON) в строку, а затем отправить ее в качестве параметра в серверную часть:

axios.delete("http://localhost:[YOUR PORT]/api/delete/" + JSON.stringify(myData), 
     { headers: { 'authorization': localStorage.getItem('token') } }
 )

На стороне сервера мы возвращаем наш объект:

app.delete("/api/delete/:dataFromFrontEnd", requireAuth, (req, res) => {
    // we could get our object back:
    const myData = JSON.parse(req.params.dataFromFrontEnd)
 })

Примечание. ответ x4wiz от 14 февраля в 15:49 более точен на вопрос, чем мой! Мое решение без тела ...

person bern9    schedule 14.06.2021

Я столкнулся с той же проблемой ... Я решил ее, создав собственный экземпляр axios. и используя это для выполнения аутентифицированного запроса на удаление ..

const token = localStorage.getItem('token');
const request = axios.create({
        headers: {
            Authorization: token
        }
    });

await request.delete('<your route>, { data: { <your data> }});
person jimijuu omastar    schedule 29.11.2018

Я попробовал все вышеперечисленное, но у меня не получилось. В итоге я просто выбрал PUT (вдохновение нашел здесь) и просто изменил логику на стороне сервера, чтобы выполнить удаление этого URL-адреса. (переопределение функции django rest framework).

e.g.

.put(`http://127.0.0.1:8006/api/updatetoken/20`, bayst)
      .then((response) => response.data)
      .catch((error) => { throw error.response.data; });
person Josh    schedule 13.10.2020

Не осознает аксиом, но может помочь людям решить проблему, которую они ищут. PHP не анализирует данные публикации при выполнении вызова удаления. Axios delete может отправлять содержимое тела с запросом. пример:

//post example
let url = 'http://local.test/test/test.php';
let formData = new FormData();
formData.append('asdf', 'asdf');
formData.append('test', 'test');

axios({
    url: url,
    method: 'post',
    data: formData,
}).then(function (response) {
    console.log(response);
})

result: $_POST Array
(
    [asdf] => asdf
    [test] => test
)


// delete example
axios({
    url: url,
    method: 'delete',
    data: formData,
}).then(function (response) {
    console.log(response);
})

result: $_POST Array
(        
)

чтобы получить данные публикации при вызове удаления в PHP:

file_get_contents('php://input'); 
person Sjaak Wish    schedule 14.07.2021