#jquery #ajax #json #syntax-error
#jquery #ajax #json #синтаксическая ошибка
Вопрос:
Пытаюсь выполнить вызов и получить очень простой, в одну строку, файл JSON.
$(document).ready(function() {
jQuery.ajax({
type: 'GET',
url: 'http://wncrunners.com/admin/colors.json' ,
dataType: 'jsonp',
success: function(data) {
alert('success');
}
});
});//end document.ready
Вот НЕОБРАБОТАННЫЙ запрос:
GET http://wncrunners.com/admin/colors.json?callback=jQuery16406345664265099913_1319854793396amp;_=1319854793399 HTTP/1.1
Host: wncrunners.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: */*
Referer: http://localhost:8888/jquery/Test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Вот ИСХОДНЫЙ ответ:
HTTP/1.1 200 OK
Date: Sat, 29 Oct 2011 02:21:24 GMT
Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d SE/0.5.3
Last-Modified: Fri, 28 Oct 2011 17:48:47 GMT
ETag: "166a2402-10-4eaaeaff"
Accept-Ranges: bytes
Content-Length: 16
Content-Type: text/plain
Connection: close
{"red" : "#f00"}
JSON возвращается в ответе (красный: #f00), но Chrome сообщает о неперехваченной синтаксической ошибке: неожиданный токен: colors.json:1
Если я перейду непосредственно к самому URL-адресу, JSON возвращается и отображается в браузере.
Если я вставлю содержимое colors.json в JSLINT, json будет проверен.
Есть идеи, почему я не могу получить эту ошибку и никогда не добираюсь до успешного обратного вызова?
РЕДАКТИРОВАТЬ — приведенный выше вызов jQuery.ajax() выполняется идеально при jsfiddle.net , и возвращает предупреждение «успех», как и ожидалось.
РЕДАКТИРОВАТЬ 2 — этот URL-адрес работает нормально ‘http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar_Rapids.json «Я заметил, что он вернулся как TYPE: text/ javascript, и Chrome не выбросил неожиданный токен. Я протестировал несколько других URL-адресов, и ЕДИНСТВЕННЫМ, который не выдает необнаруженный токен, является wunderground, который возвращается как TYPE: text / javascript .
Потоки, возвращаемые как текстовые / простые и application / json, анализируются неправильно.
Комментарии:
1. Кстати, я понял, что при нажатии на URL-адрес в браузере «#» на самом деле не отображается в json. wncrunners.com/admin/colors.json
2. Спасибо за ввод. Я удалил #, чтобы проверить теорию Кита. Его удаление не повлияло на ошибку. Я также удалил . расширение json из файла. Та же ошибка.
Ответ №1:
Вы сказали jQuery ожидать ответа JSONP, поэтому jQuery добавил callback=jQuery16406345664265099913_1319854793396amp;_=1319854793399
часть в URL (вы можете увидеть это в своем дампе запроса).
То, что вы возвращаете, — это JSON, а не JSONP. Ваш ответ выглядит так
{"red" : "#f00"}
и jQuery ожидает чего-то подобного:
jQuery16406345664265099913_1319854793396({"red" : "#f00"})
Если вам действительно нужно использовать JSONP, чтобы обойти ту же политику происхождения, то обслуживающий сервер colors.json
должен иметь возможность фактически возвращать ответ JSONP.
Если та же политика происхождения не является проблемой для вашего приложения, то вам просто нужно исправить dataType
в вашем jQuery.ajax
вызове значение быть json
вместо jsonp
.
Комментарии:
1. Спасибо, Джон. Если я возьму тот же код и укажу на него api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions /… » тогда в ответе действительно есть функция jQueryxxxx(), обернутая вокруг данных json, код выполняется нормально, и я получаю предупреждение «Успех». Я не могу изменить способ, которым удаленный сервер обслуживает файл JSON. Если я использую тип данных: ‘json’, то я получаю, что XMLHttpRequest не может загрузиться isohunt.com/js/json.php?ihq=test . Исходный локальный хост: 8888 не разрешен Access-Control-Allow-Origin.
2. Хорошо. Указанный вами URL-адрес Weather Underground отвечает на запросы JSONP. (Вы увидите это, если добавите
?callback=something
к этому URL. Ошибка, которую вы получаете при использованииdataType: json
, связана с той же политикой происхождения. Позвольте мне добавить к моему ответу.3. Проблема действительно заключается в том, что если сервер отвечает типом: text / javascript, тогда Chrome не сообщает о неперехваченной SyntaxError . Если удаленный сервер возвращает тип: text / plain или application / json, тогда Chrome сообщает о неперехваченной синтаксической ошибке.
4. @John Flatness — спасибо за это объяснение, очень полезно!
5. Спасибо!! Это было чрезвычайно полезно.
Ответ №2:
Я провел последние несколько дней, пытаясь разобраться в этом сам. Использование старого типа данных json создает проблемы с перекрестным источником, в то время как установка типа данных в jsonp делает данные «нечитаемыми», как объяснено выше. Итак, по-видимому, есть два выхода, первый не сработал для меня, но кажется потенциальным решением, и я могу делать что-то неправильно. Это объясняется здесь [ https://learn.jquery.com/ajax/working-with-jsonp / ].
Тот, который сработал для меня, заключается в следующем: 1- загрузите плагин ajax cross origin [ http://www.ajax-cross-origin.com / ]. 2- добавьте к нему ссылку на скрипт чуть ниже обычной ссылки на jQuery. 3. добавьте строку «crossOrigin: true» в вашу функцию ajax.
Хорошо идти! вот мой рабочий код для этого:
$.ajax({
crossOrigin: true,
url : "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.86,151.195amp;radius=5000amp;type=ATMamp;keyword=ATMamp;key=MyKey",
type : "GET",
success:function(data){
console.log(data);
}
})
Комментарии:
1. Краткое предупреждение: этот плагин ajax cross origin использует прокси Google. Итак, все, что вы делаете, это перетасовываете свои данные на прокси, который кто-то другой написал для вас.
Ответ №3:
У меня была такая же проблема, и решение состояло в том, чтобы инкапсулировать json внутри этой функции
jsonp (
…. ваш json…
)
Комментарии:
1. Вы инкапсулируете на стороне сервера? Или есть способ выполнить это на стороне клиента?
Ответ №4:
Этот шестнадцатеричный код может потребоваться заключить в кавычки и превратить в строку. Javascript может не понравиться символ #
Комментарии:
1. Кит, спасибо за твой ответ. Для проверки я удалил знак # из файла, чтобы содержимое теперь было {«red»: «f00»}, но та же ошибка сохраняется. Одна вещь, которую я замечаю, это то, что тип содержимого ответа — text / plain, а не application / json.
2. В качестве другого теста я переименовал файл в просто цвета (без расширения), и я получаю точно такую же ошибку.