Предыстория написания этой статьи связана с тем, что запрос на получение, инициированный axios, является нормальным в междоменной ситуации, почтовый запрос отправляет запрос параметров до отправки формального запроса, а внутренний интерфейс не имеет совместимых параметров. в результате дело 404.
При решении этой задачи я с любопытством проверил ее и добавил себе некоторые очки знаний.
Существует два типа междоменных запросов
Проще говоря, изJavaScript
код инициированXMLHttpRequest
Существует два типа запросов:
Простой запрос:
не сработаетCORS预检
запрос, но отправить запрос непосредственно на сервер, чтоCORS预检
Позже мы скажем, что правила сопоставления примерно таковы:
- Метод запроса
GET
,HEAD
,POST
один из - Радикальные поля безопасности CORS находятся в следующих наборах:
ACCEPT
Accept-Language
Content-Language
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type (值仅限text/plain,multipart/form-data,application/x-www-form-urlencoded)
- в запросе
XMLHttpRequestUpload
Объект не имеет зарегистрированных прослушивателей событий - нет в запросе
ReadableStream
объект
Запрос перед полетом:
Прежде чем отправить официальный запрос,OPTIONS
Запрос предварительной проверки отправляется на сервер, чтобы узнать, разрешает ли сервер фактический запрос. Если нет, запрос не будет отправлен. Правила сопоставления следующие:
- Метод запроса:
PUT
,DELETE
,CONNECT
,OPTIONS
,TRACE
,PATCH
один - искусственно установленный
CORS安全部首字段集合
поля снаружи - в запросе
XMLHttpRequestUpload
У объекта есть зарегистрированные прослушиватели событий - используется в запросе
ReadableStream
объект
В междоменном запросе, если сервер возвращает правильный заголовок междоменного ответа:Access-Control-Allow-Origin
,Access-Control-Allow-Method
,Access-Control-Allow-Headers
, междоменный запрос может нормально получать данные.
задача решена
В соответствии с приведенными выше точками знаний, отследите возникшие проблемы и найдите радикал запроса axios.Content-Type
Значение по умолчанию равноapplication/json;charset=utf-8
,а такжеPOST
Данные запросаjson
формат, такPOST
Запрос сначала выдаст предварительный запрос. Если ответ сервера на предварительный запрос не поддерживается, запрос будет завершен.
В соответствии с причинами, проанализированными выше, ниже перечислены два решения:
Улучшить интерфейс сервера и междоменные радикалы ответа
Включить поддержку интерфейса сервераOPTIONS
метод, и полное сопоставление ответов выполняется для радикала запроса междоменного запроса предварительной проверки, указывая, что сервер примет последующий фактический запрос, и на фактический запрос будет дан нормальный ответ.
Внешний интерфейс обрабатывает данные POST-запроса axios.
Преобразуйте запрос на простой запрос при перекрестном происхождении:
- запрос радикалов
Content-Type
установить какapplication/x-www-form-urlencoded
- иметь дело с
POST
Существует два способа запроса данных:- пройти через
URLSearchParams
генерироватьPOST
запрошенные данные - использовать
qs
Библиотекаstringify
API преобразует данные запроса (Если значение поля в данных запроса является ссылочным типом, его необходимо сначала обработать с помощью JSON.stringify, чтобы сервер не смог его распознать.)
- пройти через
пример:
/* 通过 qs 模块处理请求数据*/
import axios from 'axios'
import qs from 'qs'
axios.defaults.withCredentials = true // 若跨域请求需要带 cookie 身份识别
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
// 请求拦截器
axios.interceptors.request.use(req => {
// 对 post 请求数据进行处理
if (req.method === 'post') {
Object.keys(req.data).forEach(item => {
!isPrimeval(req.data[item]) && (req.data[item] = JSON.stringify(req.data[item]))
})
req.data = qs.stringify(req.data)
}
return req
}, error => {
// 请求出错时处理
return Promise.reject(error)
})
or
/* 通过 URLSearchParams 生成 POST 请求数据 */
import axios from 'axios'
async function anInterface (url, params = {}) {
let data = new URLSearchParams()
for(let key in params) {
data.append(params[key])
}
const res = await axios.post(url, data)
// 处理数据
return res.data
}
По вышеописанному методу,POST
Преимущества преобразования предварительных запросов в простые запросы очевидны.POST
Что касается запросов, то количество запросов можно уменьшить вдвое, и это более применимо в некоторых сценариях, когда нельзя изменить сервер.
Выше приведено все содержание данной статьи.Если есть какие-то проблемы,поправьте меня,если нужно перепечатать,укажите источник