我无法处理对jsonp请求的响应

时间:2011-12-08 09:25:44

标签: javascript json jquery jsonp

我有网址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 个答案:

答案 0 :(得分:1)

我认为你应该看看thishttp://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");
            }
        }
    }
}

答案 1 :(得分:0)

来自http://translate.google.ru/translate_a/t?client=x&text=entertext&sl=en&tl=pl i JSON的回复,而不是JSON-P。以这种方式访问​​JSON数据是违反跨站点策略的,因为浏览器会阻止将此类响应返回给客户端。

由于您被允许包含来自其他域的脚本,JSON-P是一种以javascript(而不是JSON)的形式传输数据的方式。您需要找到支持JSON-P的API(我不确定Translate API是否支持JSON-P),或者在与客户端应用程序相同的域上创建代理以访问JSON数据。

在此处阅读有关JSON-P协议的更多信息:http://json-p.org/

要创建代理,您需要实现一个获取Translate API内容并在响应中重新打印的服务。

实施例: / jsonProxy?文= FOO 应该返回http://translate.google.ru/translate_a/t?client=x&text=entertext&sl=en&tl=pl

的内容

...但您不必从其他域访问它。

答案 2 :(得分:-1)

我认为响应的MIME类型应该是'application / json'