jQuery $.ajax вызывает перекрестный домен с JSONP, возвращает статус 200, но вместо функции ошибки вызывается вместо успеха

Мое веб-приложение пытается получить доступ к информации с другого сервера, принадлежащего другому домену. Поскольку это вызов ajax с перекрестным доменом, я использовал "dataType" как "JSONP" вместо JSON.

Теперь в вкладке WebInspector-> Network я вижу, что запрос выполнен успешно, и ответ заполнен. Но функция success() никогда не вызывается. Он всегда вызывает функцию ошибки со статусом = 200.

Поскольку это запрос JSONP, jQuery добавляет "callback =?" до конца URL-адреса, и метод обратного вызова никогда не вызывался даже после получения действительного ответа. Не знаете, что пошло не так?

$(document).ready(function() {
    // When you click the Get Instances button:
    $('#getInstances').click(function(){
        $.ajax({
            type: "GET",
            url: "http://178.28.167.221:8080/us-east-1/instance/list.json",
            contentType: "application/json; charset=utf-8",
            accept: "application/json",
            crossDomain: "true",
            headers: {'Access-Control-Allow-Origin','*'},
            dataType: "jsonp",
            success: function(msg) {
                result = JSON.stringify(msg);
                var obj = $.parseJSON(result);
                console.log(obj);
                $('#instancesTable').append('<tr><td>' + obj.autoScalingGroupName + '</td><td>' + obj.amiId + '</td><td>' + obj.instanceId + '</td><td>' + obj.instanceType +'</td></tr>');                                     
            },
            error: function(xhr, ajaxOptions, thrownError, textStatus, responseText) {
                console.log(name + ' environment failed with error: ' + xhr.status + "  " + thrownError);

                var errorMessage = "Error";
                if (xhr.status == 0) {
                    errorMessage = "Can't Connect";
                }
            }
        });
    });
});

Я также проверил, включив ниже в мой запрос ajax:

        jsonp: 'callback',
        jsonpCallback: 'jsonpCallback'

и определение функции обратного вызова, как показано ниже:

       function jsonpCallback(data){
         alert("jsonpCallback");
       }

jsonCallback никогда не вызывался, даже если запрос был успешным, а ответ доступен с сервера (показано в разделе "Сетевая вкладка WebInspector").

Ответ с сервера - это массив объектов JSON. [{JSON1}, {JSON2}..]

Примечание. Я попытался изменить contentType как "application/javascript", так как ответ был массивом объектов JSON. Но ничего не получилось :(

+2
источник поделиться
1 ответ

У меня была аналогичная проблема и она была решена. вы не указали, какова ваша услуга. В моем случае это была служба WCF.

Я должен был добавить это.

   <webHttpBinding>
        <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>

и установите конфигурацию привязки к указанному выше в сервисе

т.е.: bindingConfiguration="webHttpBindingWithJsonP"

это решило проблему. Они могут быть аналогичным средством достижения того же на PHP или других платформах

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос