Подтвердить что ты не робот

JQuery getJSON() не правильно настроит заголовок Accept?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Пока еще не существует исправления.