Я не могу обработать ответ на запрос jsonp - PullRequest
1 голос
/ 08 декабря 2011

У меня есть URL http://translate.google.ru/translate_a/t?client=x&text=enter text & sl = en & tl = pl

Если вы перейдете по этой ссылке в ответ, у вас будет файл js

с текстом:

{"sentences":[{"trans":"wprowadzania tekstu","orig":"enter text","translit":"","src_translit":""}],"src":"en","server_time":80}

Я создал запрос ajax

function GoogleTranslateItem(sourceText, langFrom, langTo) {
        $.ajax({
            url: 'http://translate.google.ru/translate_a/t',
            data: { client: "x", text: sourceText, sl: langFrom, tl: langTo },
            dataType: 'jsonp',
            jsonpCallback: "getData",
            success: function (data) {
                alert("Success");
            }
        });

function getData(data) {
    var dataJson = data;
    alert('bingo');
}

, когда ответ приходит с сервера.Я не могу обработать его

в браузере показывает ошибку js.

Syntax error at line 1 while loading:
{"sentences":[{"trans":"вход вых
------------^
expected ';', got ':'   

Linked script compilation

Как мне обработать этот ответ?

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Я думаю, вы должны взглянуть на это (http://javascriptweblog.wordpress.com/2010/11/29/json-and-jsonp/)

var jsonp = {
    callbackCounter: 0,

    fetch: function(url, callback) {
        var fn = 'JSONPCallback_' + this.callbackCounter++;
        window[fn] = this.evalJSONP(callback);
        url = url.replace('=JSONPCallback', '=' + fn);

        var scriptTag = document.createElement('SCRIPT');
        scriptTag.src = url;
        document.getElementsByTagName('HEAD')[0].appendChild(scriptTag);
    },

    evalJSONP: function(callback) {
        return function(data) {
            var validJSON = false;
        if (typeof data == "string") {
            try {validJSON = JSON.parse(data);} catch (e) {
                /*invalid JSON*/}
        } else {
            validJSON = JSON.parse(JSON.stringify(data));
                window.console && console.warn(
                'response data was not a JSON string');
            }
            if (validJSON) {
                callback(validJSON);
            } else {
                throw("JSONP call returned invalid or empty JSON");
            }
        }
    }
}
0 голосов
/ 08 декабря 2011

Я думаю, что MIME-тип ответа должен быть 'application / json'

0 голосов
/ 08 декабря 2011

Ответ от http://translate.google.ru/translate_a/t?client=x&text=entertext&sl=en&tl=pl я JSON, а не JSON-P. Доступ к данным JSON таким образом противоречит межсайтовым политикам, так как браузеры предотвращают возврат таких ответов клиенту.

Поскольку вам разрешено включать скрипты из других доменов, JSON-P - это способ передачи данных в виде javascript (не JSON). Вам нужно найти API, поддерживающий JSON-P (я не уверен, что Translate API поддерживает JSON-P) или создать прокси в том же домене, что и ваше клиентское приложение, для доступа к данным JSON.

Подробнее о протоколе JSON-P читайте здесь: http://json -p.org /

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

Пример: / JsonProxy? Текст = Foo Должен вернуть содержимое http://translate.google.ru/translate_a/t?client=x&text=entertext&sl=en&tl=pl

... но вам не нужно будет получать к нему доступ из другого домена.

...