2010-09-23 3 views
10

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

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

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

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

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

+1

Сообщите нам ваш код и мы можем помочь вам больше. – Steven

+0

У меня такая же проблема в Chrome 8. $ .getJSON («url», function (data) {}) устанавливает заголовок Accept на */* –

ответ

13

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

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

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

+0

Очень проницательный ответ –

2

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

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

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

Я пробовал то, что вы предложили, заменив мой вызов getJSON (подробности теперь перечислены в главном вопросе) с вызовом $ .ajax, и результаты точно такие же. Я полагаю, что это должна быть известная ошибка, или, может быть, просто мой браузер странный, но это определенно противоречит ожидаемому поведению. – Coderer

2

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

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

Там не кажется, исправление этого еще.

+0

Вау, так что у кого-то еще есть проблема, но они не могут воспроизвести, чтобы они ее закрыли? Я посмотрю, смогу ли я внести свой вклад в это, как-то ... – Coderer

+0

Если вам интересно: билет был разрешен, и ответ Пита правильный, даже если он * выглядит * как «обычный» запрос AJAX (XHR), он реализован с динамическим тегом '