2012-02-11 1 views
5

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

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

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

Вы пытались помещать данные, которые вы получили в переменной js, а затем вставляете их в теги js. Кажется, имеет смысл, если он пытается разобрать его как js. –

ответ

8

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

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

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

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

Спасибо! Увы, это то, что я подозревал. Я прочитал о CORS (сервер определенно не поддерживает его) и той же политики происхождения, и в ретроспективе имеет смысл, что даже если сервер отправит ответ на jsonp, я бы не смог его проверить. Я действительно рассматривал возможность сделать вариант 1 (проксирование через свой собственный сервер), но, к сожалению, мне нужно, чтобы клиент был аутентифицирован. Я дам flXHR выстрел. Еще раз спасибо. –

+0

Что касается браузера/флеши аутентификации клиента, вы можете найти следующий интересующий вас вопрос: http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically –