Функция успеха JQuery не запускается с использованием JSONP
Выполнение некоторых игр вызывает мою службу, которая находится в другом домене, используя jQuery. Вызов службы успешно выполнен (моя точка отладки отключена), и возвращается правильный ответ (я обнюхаю трафик).
Моя проблема в основном в том, что успешные и отказоустойчивые обратные вызовы не срабатывают. Я прочитал несколько других сообщений в SO, которые указывают, что событие ошибки не запускается при использовании JSONP. Это случается с событием успеха (возможно, потому, что предполагается, что я предоставляю свою собственную функцию обратного вызова), а также есть способ запустить мой обратный вызов. Спасибо заранее.
$.ajax({
type: "GET",
url: urlOnDiffDomain,
async: false,
cache: false,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
error: function(xhr, ajaxOptions, thrownError) {
alert('failed....');
}
});
Ответы
Ответ 1
Хорошо. В случае, если кто-то должен знать в будущем... Оглядываясь назад, решение, вероятно, должно было быть более очевидным, чем было, но вам нужно, чтобы веб-ответ записывался непосредственно в поток ответов. Простое возвращение строки JSON этого не делает, вам нужно, чтобы кто-то ее сконструировал и передал обратно. Код в моем исходном сообщении будет работать нормально, если вы действительно это сделаете.
Пример служебного кода:
public void DoWork()
{
//it will work without this, but just to be safe
HttpContext.Current.Response.ContentType = "application/json";
string qs = HttpContext.Current.Request.QueryString["callback"];
HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}
Просто для того, чтобы быть явным, это код на стороне клиента.
function localDemo(){
$.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
function(data){
$.each(data, function(i,item){
alert(item.x);
});
});
}
Если есть лучший способ сделать это, я все уши. Для всех остальных я знаю, что в WCF 4.0 для JSONP существует некоторая концепция встроенной поддержки. Кроме того, вы можете сделать небольшую проверку в целях безопасности - хотя я не много исследовал.
Ответ 2
Метод обратного вызова success
вызывается, когда сервер отвечает. Метод $.ajax
устанавливает функцию, которая обрабатывает ответ, вызывая метод обратного вызова success
.
Наиболее вероятная причина, по которой метод success
не вызывается, заключается в том, что ответ с сервера неверен. Метод $.ajax
отправляет значение в строку запроса callback
, которую сервер должен использовать как имя функции в ответе JSONP. Если сервер использует другое имя, функция, которую установил метод $.ajax
, никогда не вызывается.
Если сервер не может использовать значение в строке запроса callback
для установки имени функции в ответе, вы можете указать, какое имя функции следует ожидать от сервера $.ajax
. Добавьте свойство jsonpCallback
к объекту опции и установите значение для имени функции, которую сервер использует в ответе.
Если, например, метод $.ajax
отправляет запрос на сервер с использованием URL http://service.mydomain.com/getdata?callback=jsonp12345
, сервер должен ответить на что-то похожее:
jsonp12345({...});
Если сервер игнорирует строку запроса callback
и вместо этого отвечает чем-то вроде:
mycallback({...});
Затем вам придется переопределить имя функции, добавив свойство к объекту options:
$.ajax({
url: urlOnDiffDomain,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
jsonpCallback: 'mycallback'
});
Ответ 3
Try
$.getJSON(urlOnDiffDomain, function(data, textStatus){
alert('success...');
});
Работает для меня, обычно. Вам нужно добавить & callback =? на urlOnDiffDomain, где jQuery автоматически заменяет обратный вызов, используемый в JSONP.
Обратный вызов ошибки не запускается, но вы можете использовать глобальный $.ajaxError, как этот
$('.somenode').ajaxError(function(e, xhr, settings, exception) {
alert('failed');
});
Ответ 4
Это не полный ответ на ваш вопрос, но я думаю, что кто-то, кто пройдет мимо, хотел бы знать это:
Когда вы имеете дело с JSONP из WCF REST, попробуйте использовать:
[JavascriptCallbackBehavior(UrlParameterName = "$callback")]
для вашей услуги; это должно дать вам JSONP из коробки.
Ответ 5
$.ajax({
url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
dataType: "json",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
artist: request.term
},
success: function( data ) {
response( $.map( data, function( item ) {
return {
label: item.artist,
value: item.artist,
id: item.id
}
}));
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});