如何使用带有 ajax (json) 的谷歌应用引擎?

Posted

技术标签:

【中文标题】如何使用带有 ajax (json) 的谷歌应用引擎?【英文标题】:How to use google app engine with ajax (json)? 【发布时间】:2011-07-03 15:22:48 【问题描述】:

如何通过ajax(json)使用google app engine?

现在我有了这个,但我收到了这个错误:

raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded


from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import simplejson as json

class AjaxHandler(webapp.RequestHandler):
    def post(self):
        args = json.loads(self.request.body)
        self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write('Hello, webapp World!')





application = webapp.WSGIApplication(
                                     [('/AJAX', AjaxHandler)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

javascript + jquery:

var Server = function() 
;
Server.prototype = 
    init: function(ajaxTargetUrl) 
        this.ajaxTargetUrl = ajaxTargetUrl;
    ,
    request: function(service, data) 
        $.ajax(
            url: this.ajaxTargetUrl,
            context: document.body,
            success: function(data) 
                $('body').append('<p>'+data+'</p>');
            ,
            error: function()
                $('body').append('<p>error</p>');
            ,
            data: data,
            type: 'POST',
            dataType: 'json'
        );
    
;

var APP = ( function() 
    var server = new Server();
    server.init('http://localhost:9999/AJAX');
    server.request('questions.all', test:'hey', y:99);
());

我的 self.request.body = str: test=hey&y=99

【问题讨论】:

【参考方案1】:

    只要我知道self.request.body 不会返回任何东西。您的查询字符串中没有名为“body”的参数,但我可能错了。所以,如果它返回一些东西,这个东西就是一个字符串。所以simplejson.dumps() 无法将其转化为有效的 JSON。

    如果您需要发送到服务器的所有参数的“列表”,请使用self.request.arguments()

    self.response.out.write('Hello, webapp World!') 不会将有效的 JSON 发送回客户端。它发送带有“application/json”标头而不是“plain/text”的 string。尝试创建一个 python 字典。例如:

    my_response = 'ajax_resp':'Hello, webapp World!' json = json.dumps(my_resposne)

    然后

    self.response.headers.add_header('content-type', 'application/json', charset='utf-8') self.response.out.write(json)

    在客户端,我建议您使用 console.log()(调试工具)来测试您的响应。

    你可以试试:

    $.ajax(
       type: 'GET',
       url: '/AJAX', // or your absolute-path
       data : name=totty&age=20,
       dataType : 'json',
       success : function(resp) 
                 
                 console.info("Ajax Response is there.....");
                 console.log(resp);
                 
       );

【讨论】:

xD totty@20 xDD 谢谢老兄!现在我明白了,但是当我将数据从 gae 序列化回 js 时,我在日期时间变量上遇到了一些问题。我有需要发送给客户的 gae 模型,我该怎么做?最佳实践 如果我的帖子对你有帮助,你可以接受答案。是的!声誉就是一切!这就是我建议在客户端使用 console.log() 的方式。如果 gae 返回错误,您可以将其视为 ajax 调用的响应文本。我知道,这不是最佳做法,但它确实有效。无论如何,您应该发布错误(日期时间)以获得进一步的帮助。 "self.request.body" 在 App Engine 中它不是请求中的参数(即 "self.request.get('body')" )。它指的是 HTTP 请求的正文。 需要 self.response.headers.add_header('content-type', 'application/json', charset='utf-8') 吗? @JimmyKane : simplejson.loads(self.request.body) 是正确的。它采用 http 请求正文,假设其格式为 json,并将其转换为 json 对象。我想说的是,在这种情况下,“body”是请求 http 正文,而不是请求中的任意参数..【参考方案2】:

您的 JavaScript 没有向 App Engine 发送 JSON 数据(test=hey&amp;y=99 是一个 urlencoded 字符串)。您的 App Engine 页面未返回 JSON 数据(Hello, webapp World! 将仅作为裸字符串接收)。

【讨论】:

以上是关于如何使用带有 ajax (json) 的谷歌应用引擎?的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有秘密管理器的谷歌应用引擎连接到 Postgres?

谷歌地图 - 点击引脚后标记部分

使用带有反应的谷歌登录按钮

如何使用 sencha touch 和 phoneGap 构建的谷歌地图提高应用程序的性能?

如何在同一张地图上使用带有多个标记的谷歌地图 API

如何在圆形语音气泡内制作带有照片的谷歌地图标记?