В большинстве случаев наши Ajax-запросы выполняются через интерфейсные библиотеки разработки, фреймворки, такие как jQuery, axios или Fly. Эти библиотеки сами по себе будут иметь некоторые перехватчики запроса/ответа для предварительной обработки запросов и ответов Ajax. Однако, если вы не используете эти сетевые библиотеки, или вы не являетесь разработчиком веб-страницы, и вам необходимо анализировать все Ajax-запросы для веб-страницы, или если вы являетесь разработчиком приложения, ваш веб-просмотр должен перехватывать все Ajax-запросы. Запросы Сетевые запросы для веб-страниц (веб-страницы разработаны не вами)... В этом случае вам необходимо перехватывать глобальные Ajax-запросы.
принцип
Независимо от того, через какой фреймворк или библиотеку ваше приложение выполняет Ajax-запросы, в конечном итоге оно вернется кXMLHttpRequest
. Поэтому суть перехвата заключается в подмене родного браузераXMLHttpRequest
. В частности, сохраните перед заменойXMLHttpRequest
, а затем решить, следует ли инициировать сетевой запрос в соответствии с конкретной бизнес-логикой в процессе запроса.XMLHttpRequest
пример.
Fly перехватывает глобальный ajax
Если вы еще не знакомы с fly, посетите его официальный сайт:Temp.GitHub.IO/Day3/#/doc/…
Мы знаем, что в Fly,XMLHttpRequest
только одинhttp engine. Итак, мы хотим перехватить, нам просто нужно настроить движок, чтобы заменить глобальныйXMLHttpRequest
Вот и все, и Fly предоставляет инструменты для быстрой генерации движков, поэтому мы можем легко реализовать перехват.
Давайте сначала рассмотрим простой пример, функция заключается в выводе URL-адреса и метода каждого сетевого запроса.
выполнить
var log = console.log;
//切换fly engine为真正的XMLHttpRequest
fly.engine = XMLHttpRequest;
var engine = EngineWrapper(function (request, responseCallback) {
console.log(request.url, request.method)
//发起真正的ajax请求
fly.request(request.url, request.data, request)
.then(function (d) {
responseCallback({
statusCode: d.engine.status,
responseText: d.engine.responseText,
statusMessage: d.engine.statusText
})
})
.catch(function (err) {
responseCallback({
statusCode:err.status,
statusMessage:err.message
})
})
})
//覆盖默认
XMLHttpRequest = engine;
axios.post("../package.json").then(log)
Давайте используем axios, чтобы инициировать запрос для его проверки:
axios.post("../package.json").then(log)
//控制台输出
> http://localhost:63341/Fly/package.json POST
> {data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, …}
Вы можете видеть, что запрошенный URL и метод выводятся в консоль, и наш перехват прошел успешно. И объект результата второй строки - axiosthen
распечатанный.
Поскольку Fly поддерживает переключение движков, мы можем сначала напрямую переключить движок fly на реальный.XMLHttpRequest
, а потом перезаписать, чтобы сетевые запросы на лету были все через реалXMLHttpRequest
Запущено (фактически, движок fly по умолчанию в среде браузераXMLHttpRequest
, вручную переключать не надо, здесь для наглядности, вручную переключается). fly автоматически синхронизирует заголовки запросов на основе объекта запроса. Если вы хотите заблокировать запрос, просто верните его в адаптере.
Другие методы перехвата
Автор когда-то написал библиотеку, посвященную перехвату ajax, адреса GithubAjax-hookОн также может перехватывать глобальные Ajax-запросы, разница в том, что он может перехватывать каждый шаг и каждый обратный вызов Ajax-запросов, что не только мощно, но и очень легко (1 КБ). По сравнению с описанным выше методом перехвата через движок fly, степень детализации перехвата Ajax-hook лучше, но Ajax-hook использует ES5.getter
,setter
, поэтому браузеры ниже IE9 не поддерживаются.
наконец
Fly — это просто открытый исходный код, если вы считаете, что это полезно для вас, добро пожаловать в звезду, спасибо за поддержку github:github.com/wendux/fly