【问题标题】:How to get JSON response in jQuery.ajax request to an appengine URL?如何在 jQuery.ajax 请求中获取对 appengine URL 的 JSON 响应?
【发布时间】:2012-02-27 11:08:03
【问题描述】:

我在 Google App Engine 上托管的 URL 服务返回 JSON 内容类型。

示例 URL 是 this,在浏览器中完美运行。也从http://jsonlint.com 验证。

我正在使用以下 jQuery.ajax 调用来获取响应。

jQuery.ajax({
type: "get",
url: "http://trim-pk.appspot.com/do?url=http://www.google.com",
dataType: "json",
success: function(response) {
    alert(response);
} 
});

出了什么问题?为什么我没有得到回应。它是空的。

我尝试了contentType: "application/json; charset=utf-8"contentType: "application/json; charset=ISO-8859-1",但得到了 500。

以下是我的 Firebug 输出。

【问题讨论】:

    标签: javascript json google-app-engine jquery


    【解决方案1】:

    您是否在 AppEngine 应用上配置了CORS

    【讨论】:

    • 没有。这件事对我来说很新鲜。我应该看看。
    • @TahirAkram 除非您这样做,否则您将只能从从 trim-pk.appspot.com 加载的页面发出 AJAX 请求,否则浏览器将阻止它以确保安全。
    • @robertc 我在我的 do servlet 中添加了resp.setHeader("Access-Control-Allow-Origin", "*");。我得到了 JSON 响应。 (调用javascript代码没有变化)。关于在应用引擎应用上启用 CORS 的好主意。
    • 请注意,'*' 不适用于大多数浏览器。而且,即使 CORS 也不适用于某些浏览器,例如 IE 或 Opera
    • @IgorArtamonov 我正在开发一个 chrome 扩展。所以这适用于 Chrome。
    【解决方案2】:

    试试

    jQuery.ajax({
        type: "get",
        url: "http://trim-pk.appspot.com/do",
        data: {
            url: "http://www.google.com"
        },
        dataType: "json",
        success: function(response) {
            alert(response);
        } 
    });
    

    【讨论】:

    • 不走运。这是跨域ajax的问题​​吗?因为我在本地主机上并调用远程。有人建议应该使用jsonp。没有那个想法。但这只是我卡住的简单事情。
    • 哦,你没说。如果您从不同的域调用 - 您需要 jsonp(或 cors,这要复杂得多)
    • 谁是 trim-pk 的所有者?你能让它用 jsonp istead 响应吗?
    • @Igor 我开发了 trim-pk 服务。好的,我让它响应 jsonp。我研究这个东西。
    【解决方案3】:

    :/是Url中的保留字符,具有特殊含义。

    要在 Url 参数中使用它们,您必须 "Url encode" 它们。浏览器会自动执行此操作。

    在 Javascript 中,您必须通过 encodeURIComponent() 函数手动执行此操作。这应该可以解决问题:

    jQuery.ajax({
        type: "get",
        url: "http://trim-pk.appspot.com/do?url=" + encodeURIComponent("http://www.google.com"),
        dataType: "json",
        success: function(response) {
            alert(response);
        } 
    });
    

    更新:encodeURI替换为encodeURIComponent

    【讨论】:

    • 我仍然得到空响应。
    • 你不想做"http://trim-pk.appspot.com/do?url=" + encodeURIComponent("http://www.google.com");吗? url 参数必须是格式正确的 URL。
    • @robertc 有一些进展。我照你说的做了,改变了dataType:“jsonp”。我在我的萤火虫中得到了这个:i.imgur.com/B3HKK.png
    • @TahirAkram 如果您在 @ 和名称之间留有空格,则响应通知不起作用
    • @robertc:你是对的。只有部分 URI 需要进行 URL 编码 - 参数值。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多