JQuery AJAX JSON DataType Преобразование - PullRequest
8 голосов
/ 18 марта 2011

Надеюсь, этот заголовок не является слишком загадочным.Происходит следующее: у меня есть сценарий jQuery AJAX, который я пытаюсь использовать для доступа к API на удаленном сервере, который возвращает ответ JSON.Однако API возвращает JSON как MIME-тип «text / html» (в заголовке ответа) вместо «application / json».Казалось бы, очевидно, что мне просто нужно изменить тип возвращаемого содержимого с текста на JSON, чтобы вызов AJAX правильно интерпретировал данные.

К сожалению, это не так.Я пробовал это множеством разных способов, но все они терпят неудачу.Самое близкое, что я получил, чтобы заставить этот вызов API работать, когда отладчик говорит мне: «Ресурс интерпретируется как Script, но передается с MIME-типом text / html».И AJAX вызывает ошибки с моим отладочным сообщением, которое выгружает объект jqXHR в формате JSON, который говорит мне: {"readyState":4,"status":200,"statusText":"parsererror"}

Вот пример моего кода (хотя я изменил код многими различными способами,в моих попытках заставить его работать, но эта версия кажется наиболее близкой к правильной):

$.ajax({
    type: 'GET',
    url: 'http://username:api-key@www.kanbanpad.com/api/v1/projects.json',
    contentType: 'application/json',
    dataType: 'jsonp',
    converters: {
        'jsonp': jQuery.parseJSON,
    },
    success: function(data) {
        alert(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(JSON.stringify(jqXHR));
        console.log(textStatus+': '+errorThrown);
    }
});

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

Также стоит отметить, что если вы скопируете / вставите URL-адрес API в адресную строку браузера и нажмете кнопку go, это даст правильный ответ JSON с соответствующим заголовком ответа («application /JSON ")

Ответы [ 4 ]

1 голос
/ 12 апреля 2011

Таким образом, если Kanbanpad не обновит свой API, к нему нельзя получить прямой доступ с помощью JS.Вам придется использовать PHP (или какой-то другой) для обработки запросов.

Он работает так же хорошо, просто требуется дополнительный шаг - все.

Просто для тех, кто искалрешение.

0 голосов
/ 18 марта 2011

Попробуйте изменить тип контента на этот

                contentType: "application/json; charset=utf-8",
0 голосов
/ 24 марта 2011

Убедитесь, что ваш сервер отправляет ответ jsonp. Это означает, что json должен быть заключен в строку вашего обратного вызова.

Имя обратного вызова передается в параметрах, и если вы не устанавливаете его явно, оно выглядит примерно так: jQuery15102810791094068532_1300988427891 (согласно http://www.json -p.org / )

На вашем сервере необходимо отформатировать ответ:

jQuery15102810791094068532_1300988427891({...json response ...});

Где вы используете обратный вызов, определенный в параметре GET 'callback'.

Вы можете попробовать установить тип на "json" и посмотреть, работает ли он. У меня было несколько parsererror с jsonp jquery - вы можете попробовать http://code.google.com/p/jquery-jsonp, пока он не станет немного более гладким.

0 голосов
/ 18 марта 2011
    dataFilter(data, type)Function
    A function to be used to handle the raw response data of XMLHttpRequest.
This is a pre-filtering
function to sanitize the response. You should return the sanitized data. The function
accepts two arguments: The raw data returned from the server and the 'dataType' parameter.

Я бы изменил тип содержимого в перехватчике dataFilter на json. Имейте в виду, что это влияет на все вызовы ajax, поэтому используйте информацию из data , чтобы решить, какие из них вы хотите конвертировать.

...