使用 Google App Engine (Python) 响应 AJAX GET 和 POST 请求
Responding to AJAX GET and POST requests with Google App Engine (Python)
我对服务器(这里是应用程序引擎)如何响应 AJAX GET 和 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 response不写在页面上发送给JS吗?在上面的代码中,responseText 是一个空字符串,但是 json 打印在屏幕上。
您可以像这样将 POST 处理程序添加到您的 SyncHandler
:
def post(self):
...
self.response.out.write(json_txt)
奇怪的是,如果没有此代码来处理请求,您的 POST 请求将无法工作。您只在代码中显示了一个 get()
方法。
我正在 AJAX 使用应用引擎成功获取请求。
您的同步处理程序看起来是正确的。你确定它正在被调用吗?在那里添加 logging.info()
语句以确保。如果它被调用,那么我怀疑错误在前端。我使用 jQuery 而不是 XMLHttpRequest
所以我不能帮你。我的 jQuery 调用如下所示:
$.get(url, callback_function, 'json');
我对服务器(这里是应用程序引擎)如何响应 AJAX GET 和 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 response不写在页面上发送给JS吗?在上面的代码中,responseText 是一个空字符串,但是 json 打印在屏幕上。
您可以像这样将 POST 处理程序添加到您的 SyncHandler
:
def post(self):
...
self.response.out.write(json_txt)
奇怪的是,如果没有此代码来处理请求,您的 POST 请求将无法工作。您只在代码中显示了一个 get()
方法。
我正在 AJAX 使用应用引擎成功获取请求。
您的同步处理程序看起来是正确的。你确定它正在被调用吗?在那里添加 logging.info()
语句以确保。如果它被调用,那么我怀疑错误在前端。我使用 jQuery 而不是 XMLHttpRequest
所以我不能帮你。我的 jQuery 调用如下所示:
$.get(url, callback_function, 'json');