Функция успеха jQuery, не стреляющая использующий JSONP

Выполнение некоторого проигрывания называет мой сервис, который находится на другом домене с помощью jQuery. Вызов к сервису успешно выполняется (моя точка отладки смещена), и корректный ответ возвращается (я осуществляю сниффинг трафика).

Моя проблема состоит главным образом в том, что успех и обратные вызовы отказа не становятся запущенными. Я прочитал некоторые другие сообщения на том, Так, чтобы указали, что ошибочное событие не запущено при использовании 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....');
  }
}); 

28
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

Хорошо. На случай, если кому-то понадобится знать в будущем ... Оглядываясь назад, возможно, решение должно было быть более очевидным, чем было, но вам нужно, чтобы веб-ответ записывался непосредственно в поток ответа . Простое возвращение строки 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. Кроме того, вы можете сделать небольшую проверку в целях безопасности - хотя я не особо исследовал.

19
ответ дан 28 November 2019 в 03:41
поделиться

Метод обратного вызова success вызывается, когда сервер отвечает. Метод $. Ajax устанавливает функцию, которая обрабатывает ответ, вызывая метод обратного вызова success .

Наиболее вероятная причина того, что метод success не вызывается, заключается в том, что ответ сервера неверен. Метод $. Ajax отправляет значение в строке запроса обратного вызова , которое сервер должен использовать в качестве имени функции в ответе JSONP. Если сервер использует другое имя, функция, установленная методом $. Ajax , никогда не вызывается.

Если сервер не может использовать значение в строке запроса обратного вызова для установки имени функции в ответе, вы можете указать, какое имя функции должно ожидать метод $. Ajax с сервера.Добавьте свойство jsonpCallback к объекту option и установите значение имени функции, которую сервер использует в ответе.

Если, например, метод $. Ajax отправляет запрос на сервер с использованием URL-адреса http://service.mydomain.com/getdata?callback=jsonp12345 , сервер должен ответить примерно так:

jsonp12345({...});

Если сервер игнорирует строку запроса обратного вызова , а вместо этого отвечает примерно таким:

mycallback({...});

Тогда вам придется переопределить имя функции, добавив свойство в объект параметров:

$.ajax({
  url: urlOnDiffDomain,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  jsonpCallback: 'mycallback'
});
14
ответ дан 28 November 2019 в 03:41
поделиться

Попробуйте

$.getJSON(urlOnDiffDomain, function(data, textStatus){
    alert('success...');
});

Обычно у меня работает. Вам нужно добавить & callback =? на urlOnDiffDomain, где jQuery автоматически заменяет обратный вызов, используемый в JSONP.

Обратный вызов ошибки не запускается, но вы можете использовать глобальную $ .ajaxError, например

$('.somenode').ajaxError(function(e, xhr, settings, exception) {
    alert('failed');
});
0
ответ дан 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: