Используя JavaScript, возможно ли захватить полезную нагрузку тела из исходящего запроса на выборку? - PullRequest
0 голосов
/ 22 июня 2019

поэтому я хочу добавить некоторые функциональные возможности к уже существующему сайту, чтобы сделать мою жизнь проще. Одна вещь, в которой я нуждаюсь, что я не могу понять, это: как получить данные полезной нагрузки тела с помощью конкретного исходящего запроса «POST». Я нашел код, чтобы сделать это раньше, но не сохранил его, и я искал этот код в течение 2 дней безрезультатно.

Вот пример запроса, который сайт отправляет на сервер.

fetch("https://my.site/api/req", {"credentials":"include","headers":{"accept":"*/*","content-type":"application/json"},"referrerPolicy":"no-referrer-when-downgrade","body":"{\"symbol\":\"mySYM\",\"results\":[{\"data\":{\"id\":\"dataID\"},\"result\":\"signature\"}]}","method":"POST","mode":"cors"});

и часть, которую мне нужно поймать, это часть "body", а затем уберите ее, чтобы она выглядела следующим образом.

{"symbol":"mySYM","results":[{"data":{"id":"dataID"},"result":"signature"}]}

Также, если возможно, я бы хотел, чтобы он перехватывал данные только тогда, когда метод = POST и запрашивает переход на определенный URL, поэтому он будет перехватывать / api / req / и не обращать внимание на другие URL и / или когда Метод = GET, HEAD.

В настоящее время я вручную получаю данные из запроса, используя инструменты dev, нажимая на правильный запрос, затем прокручивая вниз, чтобы найти данные POST.

В случае, если вам нужно знать причину этого. Сервер подписывает данные через соединение через веб-сокет, и я, по сути, пытаюсь захватить эту подпись, чтобы иметь возможность ее воспроизвести. Я не пытаюсь перехватить данные веб-сокета, поскольку они неполны для моих нужд. Мне нужно перехватить все данные тела исходящего запроса.

Заранее спасибо.

1 Ответ

1 голос
/ 23 июня 2019

Выбранное решение:

Спасибо @thirtydot за ваши ответы.Обратите внимание, что в моей конкретной ситуации были только запросы на выборку, поэтому я выбрал этот маршрут.С вашим ответом, немного больше моих собственных исследований и с помощью этого сообщения я нашел это решение.Поскольку мне не важно видеть ответы (у меня есть другие функции, отвечающие за ответы, которые важны для меня).

const constantMock = window.fetch;
 window.fetch = function() {
    if (arguments[0] === '/api/req' && arguments[1].method === 'post'){
        bodyResults(arguments[1].body)
    }
    return constantMock.apply(this, arguments)
 }


function bodyResults(reqBody){
    console.log(reqBody)
}

, который помещает следующее в консоль (именно так, как я хотел).

{"symbol": "NEON", "results":[{"data": {"expires_at": "1561273300", "id": "2469c8dd"}, "signature": "6d712b9fbb22469c8dd240be13a2c261c7af0dfbe3328469eeadbf6cda00475c"}] * 101 * 101 * 101 ** теперь *

** 125 * **верните эти данные с помощью этой функции и продолжайте выполнять остальную часть моего сценария полностью автоматически.

Дополнительное решение:

В случае, если другие борются с подобными проблемами и стараются пойматьОтветы на те запросы выборки, которые я мог бы использовать в качестве альтернативы:

const constMock = window.fetch;
window.fetch = function() {
    if (arguments[0] === '/api/req' && arguments[1].method === 'post'){
        bodyResults(arguments[1].body)
    }

    return new Promise((resolve, reject) => {
        constantMock.apply(this, arguments)
            .then((response) => {
                if(response.url.indexOf("/me") > -1 && response.type != "cors"){
                    console.log(response);
                    // do something for specificconditions
                }
                resolve(response);
            })
            .catch((error) => {
                reject(response);
            })
    });
}

function bodyResults(reqBody){
    console.log(reqBody)
}

Возможное решение XHR

ПРИМЕЧАНИЕ: это не проверено!Альтернативное решение для запросов XHR может быть сделано аналогично, используя что-то вроде:

(function(open) {
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    alert('Intercept');
    open.call(this, method, url+".ua", async, user, pass);
  };
})(XMLHttpRequest.prototype.open);

Надеюсь, это поможет!

...