Получение JSONP через jQuery - PullRequest
6 голосов
/ 02 июня 2011

ОБНОВЛЕНИЕ 1:

Это то, что я получаю в браузере, если набираю

http://www.remote_host.com/feed.php?callback=jsonpCallBack

{
    "rss": {
        "channels": [
            {
                "title": "title goes here",
                "link": "http://www.remote_server.com/feed.php",
                "description": "description goes here",
                "items": [
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    },
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    },
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    }
                ]
            }
        ]
    }
}

Так что этоне jsonp?

ОРИГИНАЛЬНЫЙ ВОПРОС:

У меня есть следующий скрипт, где я пытаюсь получить данные json с удаленного хоста:

$(document).ready(function() {
    get_json_feed();

    function get_json_feed() {
        $.ajax({
            url: 'http://www.remote_host.com/feed.php?type=json',
            type: 'GET',
            dataType: 'jsonp',
            error: function(xhr, status, error) {
                alert("error");
            },
            success: function(json) {
                alert("success");
            }
        });
    }
});

Но по какой-то причине я получаю сообщение об ошибке:

Предупреждение. Ресурс интерпретируется как сценарий, но передается с MIME-типом text / html.

Ошибка: необработанная ошибка синтаксиса: неожиданный токен:

Что я делаю не так?

Ответы [ 3 ]

7 голосов
/ 02 июня 2011

Протокол JSONP основан на том, что сайт отвечает на ваш запрос оператором JavaScript в форме,

 someFunction( someJSON )

Имя функции предоставляется в качестве аргумента из вашего кода, при этом идея заключается в том, что сценарий ответа, когда он будет использован и интерпретирован браузером, приведет к вызову этой функции с анализируемым большим двоичным объектом JSON & mdash; то есть объект JavaScript. Библиотека jQuery выполнит некоторую работу по поддержке за вас, даже в том случае, если вы создадите глобально ограниченную функцию для вызова (это будет код, который просто вызывает обратный вызов, который вы предоставляете в качестве аргумента «успеха»).

Таким образом, вы должны проверить, как выглядит фактический ответ от этого сервера. Мне кажется, что это не тот сервер, который готов ответить таким образом. Вам может необходимо убедиться, что в вашем URL есть дополнительный параметр в форме "callback =?".

6 голосов
/ 02 июня 2011

Я не знаю точно, с какой ошибкой вы сталкиваетесь, но есть несколько полезных советов по использованию jsonp здесь

  • error: этот обработчик не вызывается для междоменных сценариев и запросов JSONP.
  • записать jsonp: 'callback', jsonpCallback: 'jsonpCallback' в параметрах ajax. Установка jsonp для обратного вызова, а затем установка jsonpCallback для jsonpCallback приводит к тому, что строка запроса выглядит следующим образом:

    http://domain.com/jsonp-demo.php?callback=jsonpCallback&name=watever

  • Загрузка в блок JSON с использованием JSONP. Добавьте дополнительный ?callback=? в конец вашего URL, чтобы указать обратный вызов.

Ваш полный скрипт будет выглядеть так:

<script>
    $(document).ready(function(){

        $("#useJSONP").click(function(){
            $.ajax({
                url: 'http://domain.com/jsonp-demo.php',
                data: {name: 'Chad'},
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'jsonpCallback',
                success: function(){
                    alert("success");
                }
            });
        });

    });

    function jsonpCallback(data){
        $('#jsonpResult').text(data.message);
    }
    </script>

Пример здесь

3 голосов
/ 02 июня 2011

Похоже, сервер возвращает неверный заголовок типа контента.

...