Ajax с JQuery: 200 хорошо, но не «успех» - PullRequest
2 голосов
/ 20 февраля 2012

Я столкнулся с той же проблемой при попытке междоменного запроса.Ситуация странная, мои данные загружаются при попадании запрошенного URL непосредственно в браузер, странная часть, это загружается, если запрашивается также с использованием jquery ajax, но не на firebug console , а на firebug нетто таб.Вывод на консоль: образец данных об ошибках: parsererror {пока данные json правильно сформированы и отформатированы, проверено на валидаторах json}

readyState: 4 status: 200 responseText: undefined

Net вкладка загружает вседанные в ответ и json подвкладка

Мой пример кода:

function fetchJsonData() {
$.ajax({
    type: 'POST',
    url: 'http://www.meilleurmobile.com/comparateur/resultats-comparateur-json.do',
    data: 'monthDur%5B0%5D=45.75&monthDur%5B1%5D=45.75&monthDur%5B2%5D=45.75&monthDur%5B3%5D=45.75&monthDur%5B4%5D=45.75&monthDur%5B5%5D=45.75&monthDur%5B6%5D=45.75&monthDur%5B7%5D=45.75&monthDur%5B8%5D=45.75&monthDur%5B9%5D=45.75&monthDur%5B10%5D=45.75&monthDur%5B11%5D=45.75&numSms=1000&dataVolume=1000&withoutMobile=-1&commitmentDuration=-1',
    async: false,
    cache: false,
    //contentType: 'application/json; charset=utf-8',
    crossDomain: true,
    dataType: 'jsonp',
    error: function( xhr,err ) {
        console.log( 'Sample of error data:', err );
        console.log("readyState: "+xhr.readyState+"\nstatus: "+xhr.status+"\nresponseText: "+xhr.responseText);
    },
    success: function( data ) {
        if (console && console.log) {
            console.log( 'Sample of data:', data.slice(0,100) );
        }
    }
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); });

}

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Попытки междоменных запросов XMLHttpRequest могут вас обмануть.В веб-консоли Firefox он может выглядеть как загруженный URL-адрес, но основной текст - пустая строка.

Убедитесь, что сервер поддерживает JsonP.Если вы действительно не знаете, что это значит, вам нужно поискать это.Это очень важно.

jQuery предполагает, что параметром JsonP будет "? Callback =".Если это не так, вы должны увидеть это: http://api.jquery.com/jQuery.ajax/

jsonp: переопределить имя функции обратного вызова в запросе jsonp.Это значение будет использоваться вместо callback в callback =?часть строки запроса в URL.Так что {jsonp: 'onJSONPLoad'} приведет к 'onJSONPLoad =?'перешел на сервер.Начиная с jQuery 1.5, установка для параметра jsonp значения false не позволяет jQuery добавлять строку «? Callback» в URL или пытаться использовать «=?»для трансформации.В этом случае вам также следует явно установить параметр jsonpCallback.Например, {jsonp: false, jsonpCallback: "callbackName"}

jsonpCallback: укажите имя функции обратного вызова для запроса JSONP.Это значение будет использоваться вместо случайного имени, автоматически сгенерированного jQuery.Желательно, чтобы jQuery генерировал уникальное имя, так как это облегчит управление запросами и обеспечит обратные вызовы и обработку ошибок.Возможно, вы захотите указать обратный вызов, если вы хотите включить лучшее кэширование запросов GET в браузере.Начиная с jQuery 1.5, вы также можете использовать функцию для этого параметра, и в этом случае значение jsonpCallback устанавливается равным возвращаемому значению этой функции.

Если это сбивает с толку, это может быть прощепросто сделайте это по старинке и добавьте скрипт на страницу самостоятельно с отметкой времени в URL, чтобы избежать использования кэшированной страницы скрипта.

Кстати, AFAIK, нет способа объединить JSONP и POST,JSONP - это способ обойти ту же политику безопасности источника XMLHttpRequest.Требуется добавить скрипт в DOM.Я не думаю, что вы можете сделать это, а также отправить переменные POST как часть процесса.

0 голосов
/ 21 февраля 2012
function fetchJsonData() {
$.ajax({
    type: 'POST',
    url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%20%3D%20'www.meilleurmobile.com%2Fcomparateur%2Fresultats-comparateur-json.do%3FmonthDur%255B0%255D%3D45.75%26monthDur%255B1%255D%3D45.75%26monthDur%255B2%255D%3D45.75%26monthDur%255B3%255D%3D45.75%26monthDur%255B4%255D%3D45.75%26monthDur%255B5%255D%3D45.75%26monthDur%255B6%255D%3D45.75%26monthDur%255B7%255D%3D45.75%26monthDur%255B8%255D%3D45.75%26monthDur%255B9%255D%3D45.75%26monthDur%255B10%255D%3D45.75%26monthDur%255B11%255D%3D45.75%26numSms%3D1000%26dataVolume%3D1000%26withoutMobile%3D-1%26commitmentDuration%3D-1%26_%3D1329825461536'&format=json&diagnostics=true",
    async: false,
    cache: false,
    crossDomain: true,
    dataType: 'jsonp',
    error: function( xhr,err ) {
        console.log( 'Sample of error data:', err );
        console.log("readyState: "+xhr.readyState+"\nstatus: "+xhr.status+"\nresponseText: "+xhr.responseText);
    },
    success: function( data, status ) {
        if (console && console.log) {
            console.log( 'data count:', data.query.results.json.json.length );
            $('#result-count').text( JSON.stringify(data.query.results.json.json) );
        }
    },
    jsonpCallback: 'swatCallback'
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); }); 
}


window['swatCallback'] = function(data) {
    var info = data.query.results.json.json;
    $('#callback_result_operator').html(info[0].operator);
};
0 голосов
/ 20 февраля 2012

попробуйте с

 console.log(data);

без ломтиков.

или, что еще лучше,

 console.log(JSON.stringify(data.slice(0,100)));

с JSON.stringify () (задокументировано здесь ) метод, который вы получаете строку, которая не анализируется и не проверяется на допустимость json.

надеюсь, это поможет.

...