parsererror после jQuery.ajax-запрос с типом контента jsonp
Я использую jQuery версии 1.5.1, чтобы сделать следующий вызов ajax:
$.ajax({
dataType: 'jsonp',
data: { api_key : apiKey },
url: "http://de.dawanda.com/api/v1/" + resource + ".json",
success: function(data) { console.log(data); },
error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); }
});
сервер отвечает допустимым объектом json:
{
"response": {
"type":"category",
"entries":1,
"params":{
"format":"json",
"api_key":"c9f11509529b219766a3d301d9c988ae9f6f67fb",
"id":"406",
"callback":"jQuery15109935275333671539_1300495251986",
"_":"1300495252693"
},
"pages":1,
"result":{
"category":{
"product_count":0,
"id":406,
"restful_path":"/categories/406",
"parent_id":null,
"name":"Oberteile"
}
}
}
}
но обратный вызов успеха никогда не вызывается, вместо этого обратный вызов ошибки производит этот вывод:
jQuery15109935275333671539_1300495251986 was not called
parsererror
почему это происходит?
Я не использую никаких дополнительных библиотек для jQuery.
EDIT:
Если я попытаюсь сделать вызов ajax с "json" в качестве типа данных вместо "jsonp" сервер отвечает пустой строкой.
10 ответов:
JSONP требует, чтобы ответ был обернут в какую-то функцию обратного вызова, потому что он работает путем введения тега сценария в документ в качестве механизма для загрузки данных из другого домена.
по сути, происходит то, что тег скрипта динамически вставляется в документ следующим образом:
<script src="http://the.other.server.com/foo?callback=someFn"></script>
callbackзависит от ресурса, который вы вызываете, обычно для параметра должно бытьcallbackхотя.
someFnзатем используется для обработки данные, возвращаемые с сервера, поэтому сервер должен ответить:someFn({theData: 'here'});someFn передается как часть запроса, поэтому сервер должен прочитать его и обернуть данные соответствующим образом.
это все предполагает, что вы хватаете контент из другого домена. Если это так, вы ограничены той же политикой происхождения:http://en.wikipedia.org/wiki/Same_origin_policy
после обновления до Jquery 1.5 и попытки сделать вызов через домены у меня была та же проблема. В конце концов я нашел $.помощью метода getjson работал. В частности,
$.getJSON(url, function(data){ yourFunction(data); return false; });URL, который я использовал, был такой:
var url = WEB_SERVER_URL; url = url + "&a=" + lat; url = url + "&b=" + lng; .... url = url + "&jsoncallback=?";на сервере, который работает на другом сервере, и у меня есть контроль над этим был добавлен код:
PrintWriter writer = response.getWriter(); String jsonString = json.toString(JSON_SPACING); String callback = request.getParameter("jsoncallback"); // if callback in URL and is not just the "?" (e.g. from localhost) if (callback != null && callback.length() > 1) { writer.write(callback + "(" + jsonString + ");"); } else { writer.write(jsonString); }(объект json является экземпляром JSONObject, код можно найти здесь http://www.json.org/java/)
когда вы используете jsonp в качестве типа данных (делая кросс-доменный запрос) Jquery генерирует случайную функцию и добавляет запрошенный url в качестве строки запроса с именем callback (callback=?), вам нужно добавить данные JSON ответа в качестве параметра этой функции, как указано ниже -
url : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request url call by ajax : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request&callback=jQuery1510993527567155793_137593181353данные ответа должны выглядеть так:
string callback = context.Request.QueryString["callback"]; if (!string.IsNullOrEmpty(callback)) context.Response.Write(string.Format("{0}({1});", callback, jc.Serialize(outputData))); else context.Response.Write(jc.Serialize(outputData));подробнее о :parsererror после jquery.ajax-запрос с содержимым jsonp типа
есть одна маленькая ошибка :) Вы должны попросить .js и нет .формат JSON.
$.ajax({ dataType: 'jsonp', data: { api_key : apiKey }, url: "http://de.dawanda.com/api/v1/" + resource + ".js", success: function(data) { console.log(data); }, error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); } });Ну а вы заметили, что есть клиент для api ? https://github.com/dawanda/dawanda-api-client-js
вы действительно не должны указывать jsonp здесь. Просто используйте json потому что вы просто получаете строку JSON. json (json с дополнением) ожидает выполнения функции javascript. В этом случае вам нужно указать "callback=" в строке запроса. Наверное, так и есть.причина, по которой jQuery не может справиться с этим также, есть свойство с именем обратного вызова.
попробуйте прочитать ответ в объект с помощью $.parseJSON:
success: function(data) { var json = $.parseJSON(data); }
убедитесь, что вызываемая служба имеет возможность возвращать данные в формате JsonP.
Если вы используете asp.net webapi, вы можете использовать WebApiContrib.Форматирование.Jsonp, это с открытым исходным кодом.
убедитесь, что у вас есть строка, как показано ниже в WebApiConfig.Реестр.
config.Форматеры.Insert (0, new JsonpMediaTypeFormatter(новый JsonMediaTypeFormatter (), "обратный вызов"));
я дергал себя за волосы над этим. Надеюсь, это кому-то поможет.
Не все серверы поддерживают jsonp. Это требует, чтобы сервер установил функцию обратного вызова в его результатах. Я использую это, чтобы получить ответы json от сайтов, которые возвращают чистый json, но не поддерживают jsonp (но могут в будущем):
function AjaxFeed(){ return $.ajax({ url: 'http://somesite.com/somejsonfile.php', data: {something: true}, dataType: 'jsonp', /* Very important */ contentType: 'application/json', }); } function GetData() AjaxFeed() /* Everything worked okay. Hooray */ .done(function(data){ return data; }) /* Okay jQuery is stupid manually fix things */ .fail(function(jqXHR) { /* Build HTML and update */ var data = jQuery.parseJSON(jqXHR.responseText); return data; }); }
та же проблема, которую я получал, пока я не добавил параметр " callback=?"или "с=?" в url.
например :"http://de.dawanda.com/api/v1/ " + ресурс +".json&c=?"
Может решить вашу проблему. Это сработало для меня.
спасибо Эвану Тримболи.
добавлены только изменения, которые я сделал
json-callback=someFun
и изменил анонимное имя функции с
функция (dl)
to
функция someFun (dl)
полная строка кода приведена ниже:
getJSON("http://localhost/phk/districtList.json?json-callback=someFun", function someFun(dl){ .... .... }

Comments