#javascript #jquery #ajax #json #jsonp
#javascript #jquery ( jquery ) #ajax #json #jsonp #jquery
Вопрос:
Если у меня есть следующий запрос
$.ajax({
type: "GET",
dataType: "jsonp",
jsonp: "callback",
jsonpCallback: "my_callback",
url: my_https_url,
headers:{"Content-Type":"text/html; charset=utf-8"},
success: function(data) {
eval("json=" data);
}
error: function() {
console.log("fail");
}
});
Я получаю ответ сервера с кодом состояния 200. В заголовке ответа говорится, что он отправляет обратно текст / html в качестве типа содержимого. Однако я знаю, что содержимое на самом деле представляет собой форматированные данные JSON. Проблема в том, что сервер не настроен на прием запросов JSONP (и я не могу его изменить). Я использую подход JSONP по причинам, связанным с междоменностью. Статус ошибки, который я получаю обратно, — это «parseerror», потому что он не распознается как JSON. Есть ли способ переопределить функцию, отвечающую за синтаксический анализ данных, чтобы я мог принудительно обрабатывать их как JSON? Возможно, с помощью eval()?
Комментарии:
1. просто используйте text и JSON.parse(theResponseText)
2. Если он не принимает запросы JSONP, зачем тогда вы пытаетесь использовать этот подход ?!
3. Я забыл одну вещь в сообщении (обновлено). Я изменил раздел заголовков, чтобы рассмотреть текст. Все еще возникают проблемы.
4. @JoshBradley:
headers
объект указывает те, которые отправляются с запросом . Поскольку запрос GET не содержит никакого содержимого, установка content-type совершенно бессмысленна.
Ответ №1:
Если ваш сервер не способен создать ответ в формате JSONP, и вам приходится использовать JSONP из-за ограничений того же источника, то вам просто не повезло. Ответ в формате JSONP представлен в виде исполняемого скрипта, который вызывает указанный обратный вызов.
Обычно вы не можете получить JSON из другого источника. Вам либо нужен JSONP, либо вам нужен современный браузер с сервером, настроенным для разрешения запросов с перекрестным источником. Если вы не можете настроить сервер так, чтобы разрешать перекрестные исходные запросы, тогда вам нужен сервер для создания JSONP. Если он этого не сделает, вы не сможете получить от него данные. JSONP — это обходной путь для запросов с разными источниками, и для создания структуры в формате JSONP для ответа ТРЕБУЕТСЯ взаимодействие с сервером.
Если вы получаете структуру JSONP с сервера, а jQuery выдает ошибку синтаксического анализа при попытке проанализировать ответ как JSON, то это потому, что все, что отправляет сервер, не является законным JSON внутри структуры JSONP. Тот факт, что вы получаете ошибку синтаксического анализа, будет означать, что jQuery пытается проанализировать его как JSON и получает ошибку при попытке сделать это. Если это так, то у вас есть два варианта:
- Исправьте данные, отправляемые сервером, чтобы они были на 100% легальными JSON.
- Примите данные в виде текста и исправьте его как законный JSON или проанализируйте его самостоятельно каким-либо образом, который принимает его таким, какой он есть.
В любом случае, первый шаг, вероятно, заключается в том, чтобы просмотреть console.log()
отправляемый текст и точно понять, почему он не принимается как законный JSON. Тогда вы будете лучше знать, какие у вас есть варианты. Если вам нужна помощь в понимании этого, добавьте точный ответ сервера на ваш вопрос.
Комментарии:
1. Нет, ошибка синтаксического анализа исходит от jQuery, пытающегося включить JSON в качестве сценария JSONP.
2. @Bergi — Я не думаю, что мы можем точно сказать, какая причина вызывает ошибку синтаксического анализа, но я также добавил информацию об этой возможной причине в свой ответ.
3. как вы относитесь к # 2? похоже, что синтаксический анализ происходит до обратного вызова
4. @Fakeer — У вас должен быть JSONP, который передавал unparsed JSON в обратный вызов, а затем настроить вашу платформу ТАК, чтобы ОНА НЕ пыталась автоматически анализировать его, чтобы вы могли получить доступ к необработанному JSON.
5. Спасибо. в моем случае это просто angular 1.6 $ http.jsonp