Если я использую запрос на выборку для отправки запроса 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, в этих двух есть фундаментальное различие. Может ли кто-нибудь сказать мне, верен ли мой вывод, и объяснить причину такого поведения.
Также, если мы изменим указанный выше тип метода конечной точки на «POST». и что бы мы ни использовали axios или fetch api. если мы отправляем почтовый запрос без поля body в случае fetch API или без поля данных в случае axios, предварительный запрос не будет отправлен. Из статей и документации, которые я прочитал, я понял, что если запрос является запросом, отличным от «GET» или «OPTION», будет отправлен предварительный запрос. но в этом случае предварительная проверка не будет отправлена только для запроса «POST», она должна содержать тело или данные для отправки браузером предварительной проверки.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 настройку тела запроса.
Это приводит к предварительному запросу, который, в случае успеха, сделает реальный запрос с типом содержимого, но без содержимого в теле.
Делать выводы не нужно, код с открытым исходным кодом — github.com/axios/axios#features. Вы не ослышались, это обертка над XHR, а не выборка