Подтвердить что ты не робот

Функция успеха 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....');
  }
}); 
4b9b3361

Ответ 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);
                  }
            });