Axios Видалити запит із тілом та заголовками?


119

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

Для цього мені потрібні заголовки:

headers: {
  'Authorization': ...
}

і тіло складається з

var payload = {
    "username": ..
}

Я шукав у міжмережах і виявив лише, що метод DELETE вимагає "param" і не приймає "data".

Я намагався надіслати його так:

axios.delete(URL, payload, header);

або навіть

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

Але, здається, нічого не працює ...

Хтось може сказати мені, чи можливо (я припускаю, що це можливо) надіслати запит на ВИДАЛЕННЯ як із заголовками, так і з текстом, і як це зробити?

Заздалегідь спасибі!

Відповіді:


145

Тож після декількох спроб я виявив, що це працює.

Будь ласка, дотримуйтесь послідовності замовлення , дуже важливо, інакше це не спрацює

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

2
Привіт, ти можеш пояснити, чому твоя відповідь працює?
Франко Гіл

102

axiox.deleteпідтримує орган запиту. Він приймає два параметри: url та необов'язковий config. Ви можете використовувати config.dataдля встановлення тіла та заголовків запиту наступним чином:

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

Дивіться тут - https://github.com/axios/axios/issues/897


Річ у тім, що я хочу надіслати тіло та заголовки в тому самому запиті на видалення
Asfourhundred

83

Ось короткий зміст форматів, необхідних для надсилання різних http-дієслів із axios:

  • 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ключ

11
Ваша відповідь змушує мене хотіти, щоб у переповненні стека була функція +2 за голосування.
eli-bd

Це єдина відповідь, яка детально це пояснює. Дякую, це справді допомогло зрозуміти навіть інших.
Джефф

Як надіслати запит на видалення з параметрами, а не тілом?
Аджай Сінгх,

Найкраща відповідь на це питання. Дякую.
HartleySan

1
@MaFiA, якщо ви хочете надіслати запит на видалення з параметрами. Ви можете просто помістити його в URL за допомогою рядків запитів
Van_Paitin

14

аксіос. Видаляти є пройшло URL і додаткової конфігурації .

axios.delete (url [, config])

Доступні для конфігурації поля можуть містити заголовки .

Це робить так, що виклик API може бути записаний як:

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

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

Це не працює для мене ... У мене є const headers = {'Authorization': ...}і data = {'username': ...}закінчується, axios.delete('http://...', {headers, data})але сервер не може отримати доступ до заголовків ...
Asfourhundred

Запит, який надходить із браузера, говорить про інше. Дивіться цей Stackblitz ( stackblitz.com/edit/react-gq1maa ), а також запит на вкладці мережі браузера ( snag.gy/JrAMjD.jpg ). Тут потрібно бути впевненим, що ви правильно читаєте сторону сервера заголовків або що запит не перехоплений і не підроблений.
Олувафемі Суле

6

У мене була та сама проблема, яку я вирішив так:

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

5

Власне, axios.deleteпідтримує тіло запиту.
Він приймає два параметри: a 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)

Сподіваюся, це комусь допоможе!


1
Дякую, я використовую це у своєму методі видалення nestJs HttpService як: this.httpService.delete (apiUrl, {headers: headersRequest, data: deleteBody})
shanti


2

Щоб надіслати 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, деякі інші часи (коли це можливо , не буде потрібно) ви просто передати заголовки , як 2 - го параметра .

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

Майте на увазі, що згідно з визначенням об'єкта конфігурації ( https://github.com/axios/axios#request-config ) ви все одно можете передавати тіло HTTP у виклик HTTP через dataполе під час виклику axios.delete, однак для HTTP ВИДАЛИТИ дієслово, воно буде проігноровано.

Ця плутанина між 2-м параметром, який іноді є тілом HTTP, та іншим часом, коли використовується цілий configоб’єкт axios, пов’язана з тим, як були реалізовані правила HTTP. Іноді тіло HTTP не потрібне, щоб виклик HTTP вважався дійсним.


0

Я зіткнувся з тією ж проблемою ... Я вирішив її, створивши власний екземпляр axios. і використовуючи це для створення автентифікованого запиту на видалення ..

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

await request.delete('<your route>, { data: { <your data> }});

0

я знайшов спосіб, який працює:

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

Я сподіваюся, ця робота також для вас.


0

Я спробував усе вищезазначене, що мені не вдалося. У підсумку я просто пішов з PUT (натхнення знайдено тут ) і просто змінив логіку на стороні сервера, щоб виконати видалення цього виклику url. (перевизначення функції рамки відпочинку django).

напр

.put(`http://127.0.0.1:8006/api/updatetoken/20`, bayst)
      .then((response) => response.data)
      .catch((error) => { throw error.response.data; });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.