Как работает этот JSONP без обратного вызова? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую клиентский SDK, который создает скрипт под капотом и прикрепляет его к <head> и выглядит следующим образом:

<script src="http://foo.com?foo=bar"></script>

Обратите внимание, что callback параметр отсутствует.

Ответ возвращает следующее (с заголовком Content-Type: application/javascript):

{ document.cookie="something=thing" }

И он устанавливает cookie вбраузер (я вижу, когда смотрю на куки в инструментах разработчика).

Странно, что в URL скрипта нет параметра обратного вызова, как вы обычно ожидаете в запросе JSONP.

Я попытался воспроизвести это поведение, добавив аналогичный сценарий на локальную веб-страницу, и я запускаю локальный сервер, который возвращает тот же ответ, но в отличие от SDK он не устанавливает cookie-файл.Сам SDK довольно прост, и я не вижу никакой другой магии.

Кто-нибудь видел что-то подобное раньше?Как это работает?

Редактировать: вот внутренний метод SDK и пример ответа

    _jsonp: function(o, e) {
        var t = document.createElement("script");
        t.type = "text/javascript", t.src = e, t.async = !0, document.getElementsByTagName("head")[0].appendChild(t), o.log("SENT JSONP request: " + e)
    },

Пример ответа:

Заголовки ответа

Connection: keep-alive
Content-Encoding: gzip
Content-Length: 158
Content-Type: application/javascript

Тело ответа

{document.cookie=<redacted>}

1 Ответ

0 голосов
/ 14 ноября 2018

Несмотря на имя метода в исходном коде API, это не JSONP.

JSONP - это программа JavaScript, которая соответствует определенному формату: содержит только вызов функции с одним аргументом, которыйбыть JSON, если он был извлечен из программы JavaScript и помещен в файл JSON.

JSONP работает, внедряя элемент <script>, который загружает и выполняет программу JavaScript.

Что у вас естьВот программа JavaScript, которая не соответствует формату JSONP.

Это все еще программа JavaScript.

Загрузка с <script> все еще работает.

...