отправить запрос как jsonp, интерпретировать ответ как текст, используя jQuery 1.5 - PullRequest
5 голосов
/ 11 февраля 2012

Короткий вопрос: есть ли способ сделать запрос jsonp серверу, перехватить запрос, но не анализировать его как javascript? Я использую dataType: "текст jsonp" в jQuery 1.5, но он не работает.

Я пытаюсь получить доступ к междоменному URL через AJAX с помощью jsonp. Проблема в том, что другой домен (список каталогов в моем университете) очень старый, и я сомневаюсь, что сервер поддерживает jsonp.

  • В Firefox я получаю сообщение об ошибке «Несоответствие имени тега XML (ожидаемый META)». В chrome я получаю «Uncaught SyntaxError Unexpected token <», указывающий на файл, соответствующий моему запросу AJAX. Строка ошибки из обратного вызова ошибки - "parsererror". </li>
  • Я не могу сделать обычный вызов AJAX - когда я изменяю тип данных на «текст» или удаляю его все вместе, другой домен жалуется, что пользователь не аутентифицирован, и перенаправляет на страницу входа - даже если я Вы уже зашли в браузер. Когда dataType равен jsonp, этого не происходит.
  • Я знаю, что сервер должен поддерживать JSONP, и я не думаю, что это так, но когда я изменяю dataType на JSONP, я вижу, что ресурсы страницы ответов отображаются как в Chrome, так и в Firefox - поэтому сервер фактически отправляет ответ браузеру (статическая HTML-страница + некоторый Java-скрипт), который содержит данные, которые я хочу получить.
  • Проблема в том, что jQuery пытается проанализировать ответ как javascript и не может (потому что это не javascript). Таким образом, данные попадают в браузер - мне просто нужно получить к ним доступ!
  • Использование dataType: «текст jsonp», который, как предполагается, указывает на отправку запроса jsonp и интерпретацию ответа как текста, не имеет значения - все еще ошибка синтаксического анализа.

Что мне нужно, так это: получить доступ к ответу на запрос jsonp в виде простого текста. Или, если я смогу получить доступ к необработанному ответу на неудачный запрос jsonp - это тоже сработает.

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

Код:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname';
var jqxhr = $.ajax({type:"GET",
url: ajax_url,
dataType:"jsonp text",
callback: "whatever",
success:function(responseData) {
   $('div#content').text( responseData.slice(0, 100) );
   dbg(responseData.slice(0,100));
}})
.success(function() { alert("success"); })
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);})
.complete(function() { alert("complete"); });

1 Ответ

8 голосов
/ 11 февраля 2012

То, чего вы пытаетесь достичь, не сработает: jsonp можно использовать только в том случае, если сервер правильно внедрил ответ в вызов функции javascript.

Даже если сервер действительно отправляет файл в браузер, вы не сможете получить к нему доступ из-за ограничений безопасности: все, что вы можете сделать, это выполнить указанные данные в виде скрипта (с тегом скрипта) или использовать его как таблицы стилей (с использованием тега ссылки), но вы никогда не сможете проверить ответ в виде необработанного текста, если он находится в другом домене.

Полагаю, вы пытались получить данные в формате XML напрямую и что это не удалось (это означает, что сайт не поддерживает CORS ). Если вы не можете изменить код на стороне сервера, тогда у вас есть только две альтернативы:

  1. Создайте прокси на вашем собственном сервере, который будет туннелировать ответ (ваш серверный скрипт выполняет фактический запрос и отправляет его в браузер): тот же домен будет применяться с точки зрения клиента, и вы будете возможность запрашивать данные как XML,
  2. Используйте флэш-память для обхода безопасности браузера (вы можете использовать flXHR , но, похоже, она немного устарела).
...