使用Google App Engine(Python)响应AJAX GET和POST请求

使用Google App Engine(Python)响应AJAX GET和POST请求,python,ajax,google-app-engine,http,webapp2,Python,Ajax,Google App Engine,Http,Webapp2,我对服务器(这里是appengine)如何响应ajaxget和POST请求感到困惑。我想向我的服务器发送一个GET请求,并获取一些JSON数据 下面是AJAX GET请求 function syncRestoreLinks(e) { var request = new XMLHttpRequest(); var url = "/sync" request.open("GET", url); request.setRequestHeader("Content-T

我对服务器(这里是appengine)如何响应ajaxget和POST请求感到困惑。我想向我的服务器发送一个GET请求,并获取一些JSON数据

下面是AJAX GET请求

function syncRestoreLinks(e) {

    var request = new XMLHttpRequest();
    var url = "/sync"

    request.open("GET", url);
    request.setRequestHeader("Content-Type", "application/json");

    request.onreadystatechange = function() {
    if (request.readyState === 4) {
        console.log(request.responseText);
        }
    }
    request.send(null);
    console.log("Getting links from db");
}
服务器端的处理程序

class SyncHandler(Handler):
    def get(self):
        response_data = {"loggedIn":False, "linkData":None, "success":False}
        json_txt = json.dumps(response_data)
        self.response.headers['Content-Type'] = 'application/json; charset=UTF-8'
        self.response.out.write(json_txt)

    def post(self):
        response_data = {"loggedIn":False, "linkData":None, "success":False}
        json_txt = json.dumps(response_data)
        self.response.headers['Content-Type'] = 'application/json; charset=UTF-8'
        self.response.out.write(json_txt)
这个处理程序将我的响应数据写到屏幕上,我希望它在屏幕上发回并让JS处理。(我可以在此处使用服务器重定向。)

如果我改为发出POST请求,代码将按照我的预期工作。但在这里,我无法进行服务器重定向或呈现页面,只有脚本生成请求具有该控制权

这就是GET/POST响应的工作方式,还是我在代码中做了一些愚蠢的事情


有没有办法让GET响应不写在页面上并发送给JS?在上面的代码中,responseText是一个空字符串,但是json会打印在屏幕上。

您可以向
SyncHandler
添加一个POST处理程序,如下所示:

def post(self):
    ...
    self.response.out.write(json_txt)
    $.get(url, callback_function, 'json');

奇怪的是,如果没有此代码来处理请求,POST请求不应该工作。您的代码中只显示了一个
get()
方法。

我现在正在使用app engine成功地执行AJAX get请求

您的同步处理程序看起来正确。你确定有人叫它吗?在那里添加一个
logging.info()
语句以确保。如果正在调用它,那么我怀疑错误在前端。我使用jQuery而不是
XMLHttpRequest
,所以我不能帮你。我的jQuery调用如下所示:

def post(self):
    ...
    self.response.out.write(json_txt)
    $.get(url, callback_function, 'json');

您是否使用webapp2将url
/sync
链接到
SyncHandler
?是的,webapp2和python2.7我认为我的问题措辞不准确。我没有在代码中显示post方法,但正如您所说,它与get相同。我想知道的是为什么这些请求会以这种方式工作。一个关于AJAX请求的更一般的问题。哦,现在我明白你的问题了。如果您发送一个307状态代码,那么就可以在POST请求上指定重定向,如下所述:AJAX响应应该是JSON对象,而不是呈现的页面。我可以理解POST的工作原理。有没有办法让GET响应不写在页面上并发送给JS。在上面的代码中,responseText是一个空字符串,但是json打印在屏幕上。这是一个不同的问题。最初的问题是“使用Google App Engine(Python)响应AJAX GET和POST请求”,而不是处理AJAX响应。请提出一个新问题(或先搜索)。您的response.out.write调用是将json数据发送回JS函数还是将其打印到屏幕上?它将json数据发送回。