Fetch API против Axios API

Если я использую запрос на выборку для отправки запроса API из моего внешнего интерфейса JS, и если я попытался поместить тело в запрос на выборку. браузер выдаст ошибку, говоря

Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body

Но если я использую Axios вместо API выборки для выполнения запроса на получение, здесь будет поле данных вместо тела API выборки. и если что-то поместить в поле данных и отправить запрос на получение, браузер не выдает ошибку. но сервер ничего не получит в теле запроса. Еще одно странное поведение заключается в том, что в этом запросе на получение Axios с полем данных, имеющим значение, браузер также отправляет предварительный запрос CORS, что странно, потому что это запрос на получение.

Использование Аксиос

Ниже приведен код для создания нового токена доступа с использованием токена обновления, хранящегося в файле cookie httpOnly. Это запрос на получение axios.

Без поля данных

Код

    const response = (
      await axios.request<AuthType>({
        url: "http://192.168.1.34:4488/webadmin/generatenewaccesstoken",
        method: "GET",
        withCredentials: true,
      })
    ).data;

Вкладка «Сеть» в браузере

С полем данных

Если я изменю запрос на получение axios, чтобы включить данные с пустым объектом, браузер отправит предварительную проверку для этого запроса axios.

Код

    const response = (
      await axios.request<AuthType>({
        url: "http://192.168.1.34:4488/webadmin/generatenewaccesstoken",
        method: "GET",
        withCredentials: true,
        data:{}
      })

Вкладка «Сеть» в браузере

следующее изображение — это вкладка сети браузера, и вы можете видеть, что предварительная проверка отправляется, даже если метод запроса по-прежнему GET

Использование выборки

без поля тела

Код

    let response = await (
      await fetch("http://192.168.1.34:4488/webadmin/generatenewaccesstoken", {
        method: "GET",
        credentials: "include",
      })
    ).json();

Вкладка «Сеть» в браузере

С полем тела

Код

    let response = await (
      await fetch("http://192.168.1.34:4488/webadmin/generatenewaccesstoken", {
        method: "GET",
        credentials: "include",
        body: JSON.stringify({}),
      })
    ).json();

Вкладка «Сеть» в браузере

при использовании axios, если мы включаем поле данных в запрос на получение, браузер отправляет предварительную проверку для запроса, даже если метод запроса «GET». но при использовании fetch Api с методом, установленным на «GET», если мы попытаемся включить поле тела. браузер ничего не отправит. Также я использую браузер Edge

Из вышесказанного я делаю вывод, что данные Axios — это не просто абстракция тела axios, в этих двух есть фундаментальное различие. Может ли кто-нибудь сказать мне, верен ли мой вывод, и объяснить причину такого поведения.

P.S.

Также, если мы изменим указанный выше тип метода конечной точки на «POST». и что бы мы ни использовали axios или fetch api. если мы отправляем почтовый запрос без поля body в случае fetch API или без поля данных в случае axios, предварительный запрос не будет отправлен. Из статей и документации, которые я прочитал, я понял, что если запрос является запросом, отличным от «GET» или «OPTION», будет отправлен предварительный запрос. но в этом случае предварительная проверка не будет отправлена ​​​​только для запроса «POST», она должна содержать тело или данные для отправки браузером предварительной проверки.

Делать выводы не нужно, код с открытым исходным кодом — github.com/axios/axios#features. Вы не ослышались, это обертка над XHR, а не выборка

Adam Jenkins 09.08.2023 09:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

MDN довольно хорошо объясняет, как работает CORS, что такое простой запрос и какие запросы требуют предварительной проверки

GET-запросы не могут иметь тела, но могут иметь параметры запроса в URL.
Запросы POST также могут иметь параметры запроса в URL-адресе, но они также могут иметь тело (необязательно).
Даже если вы предоставите Axios data — если запрос GET, то Axios не добавит тело в XHR.

Ответ принят как подходящий

Вы не можете установить тело запроса GET.

Если вы попытаетесь сделать это с помощью fetch, он будет жаловаться на вас.

Если вы попытаетесь сделать это с помощью XMLHttpRequest (который axios является оберткой вокруг), то он проигнорирует вашу чепуху.


Когда вы устанавливаете тело в HTTP-запросе, вам нужно указать Content-Type этого тела (если вы не устанавливаете его с помощью механизма, из которого его можно вывести).

Передача объекта в data на axios заставит axios установить Content-Type на application/json.

Запросы между источниками с Content-Type: application/json требуют предварительной проверки.

XMLHttpRequest не будет игнорировать axios настройку Content-Type, но будет игнорировать axios настройку тела запроса.

Это приводит к предварительному запросу, который, в случае успеха, сделает реальный запрос с типом содержимого, но без содержимого в теле.

Другие вопросы по теме