GetJSON () в JQuery неправильно устанавливает заголовок Accept? - PullRequest
10 голосов
/ 23 сентября 2010

Похоже, у людей были проблемы с заголовками Accept в прошлом, но я не уверен, что моя проблема связана. При использовании jQuery 1.4.2 у меня возникают проблемы с получением JSON с getJSON(). Я могу наблюдать запрос / ответ в Firebug, и похоже, что источником проблемы является то, что рассматриваемый ресурс возвращает разные результаты в зависимости от заголовка Accept. Несмотря на то, что в документах сказано, что это должно быть установлено, в Firebug он отображается как « / » - очевидно, я хочу «application / json». Это известная ошибка? Я должен установить какой-нибудь флаг, о котором я не знаю?

ETA: запрос является межсайтовым, если это имеет значение, но я передаю параметр запроса callback=?, поэтому JQuery (успешно!) Обрабатывает его как JSONP. Служба, которую я вызываю в данном конкретном случае, поддерживает параметр запроса accept override (&accept=application/json), поэтому я заставил его работать вручную, но я все еще считаю странным сбой заголовка и надеялся, что смогу исправить это, так что я не сталкиваюсь с этим снова, когда имею дело с другим сервисом, который не может быть таким прощающим. У меня нет простого способа скопировать / вставить код из моей среды разработки, но вот суть:

$.getJSON(baseURL + "?item=" + itemNum + "&callback=?", function(data){
  console.log(data);
}

Как видите, это не совсем сложно, и должен (я уверен на 99% ...) привести к отправке XHR с заголовком Accept application/json. Как я уже сказал, этого не происходит, для сетевой консоли Firebug. Если это имеет значение, это в Firefox 3.6.8.

ETA Опять же: для всех, кто все еще читает это, да, это все еще происходит, и нет, я понятия не имею, почему. Как я уже сказал, простой вызов getJSON (), действительно базовый синтаксис, межсайтовый, рассматривается как JSONP, поскольку он включает параметр запроса обратного вызова. Все еще открыты для предложений!

Ответы [ 3 ]

13 голосов
/ 10 мая 2011

Это не ошибка.

Поскольку ваш вызов является междоменным, ваш браузер не позволит вам совершать вызовы XHR (политика одного и того же происхождения).Внутренне, jQuery обходит это, используя «<script> tag hack», чтобы сделать междоменный вызов (это основная идея для типа данных JSONP).Поскольку вызов выполняется с использованием тега, jQuery просто не может изменить часть заголовка accepts.

jQuery творит чудеса, скрывая эти детали от вас, но, к сожалению, в этом случае выпо-видимому, подчиняется закону прохудившихся абстракций .

2 голосов
/ 16 октября 2010

Это ошибка, которая была закрыта на веб-сайте jquery.

http://dev.jquery.it/ticket/6551

Похоже, исправления пока нет.

2 голосов
/ 23 сентября 2010

Не видя ваш код (который может указывать нам на очевидное решение), вы можете попробовать использовать стандартную функцию Ajax и посмотреть, если вы получите другие результаты?

$.ajax({
  url: '/what.eva',
  dataType: 'json',
  data: '{}',
  success: callbackFunc
});

function callbackFunc(result) {
   alert(result);
} 
...