我有以下代码从一个简单的3输入表格检索值:
//retrieves data from a form
var $form = $( this ),
prgname= $form.find('input[name="prg"]').val(),
startDate = $("#startdate").datepicker({ dateFormat: 'yy-mm-dd' }).val(),
endDate = $("#enddate").datepicker({ dateFormat: 'yy-mm-dd' }).val();
下面的代码将请求发送到服务器:
var request = $.ajax({
url: "/prg/",
type: "post",
data: JSON.stringify({prg: prgname, start:startDate, end:endDate}),
contentType: 'application/json',
dataType: 'json',
success: function() {},
error: function (jqXHR, textStatus, errorThrown){};
使用Python和webapp2的Im做以下,服务器端(这里是我不确定的事情)
import json
class PrgHandler(webapp2.RequestHandler):
def post(self):
prg= cgi.escape(self.request.POST['prg'])
start_date = cgi.escape(self.request.POST['start'])
end_date = cgi.escape(self.request.POST['end'])
#some code to write to db here
....
#if successful return a success message
if success:
success_msg = [{'class': 'success', 'msg': 'Successfully saved to the database'}]
else:
success_msg = [{'class': 'error', 'msg': 'Could not saved to the database'}]
data_string = json.dumps(success_msg)
self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
self.response.write(data_string)
当我得到的回应是跳过成功的功能和直接到错误。
记录错误值即时通讯没有得到任何有意义的事情:
the error is:
The text status is:error
The jqXHR is:[object Object]
Chrome的控制台是给我的错误:
Resource interpreted as Document but transferred with MIME type application/json:
我看了看,最多和SO没有工作的解决方案,我认为这是与服务器端代码中的错误:
self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
如果我注释掉上述行我没有错误在Chrome和我刚刚回来,在下面的格式正确的值的空白页上的反应:
[{"msg": "Successfully saved to the database", "class": "success"}]
在上述情况下它并保存到数据库中,所以我似乎无法发现任何错误,除了头部和根本不知道如何着手!
编辑似乎错误是我已经删除以下行服务器端:event.preventDefault();
从我的剧本,现在引起的一切问题至少即时得到的问题出在哪里的明确指示。 这是一个从错误收到发布数据,我会怎么做正确的方法是什么? 我试过如下:
json_data = self.request.GET.items()
decoded = json.loads(json_data)
但林得到一个类型错误:期望的字符串或上下面的行缓冲液:json_data = self.request.GET.items()
在你的调试器看看。 您在您的文章(webapp2的multidict)收到一个JSON字符串。 您可以使用json.loads,导致蟒蛇对象这个字符串进行解码。
这里是我的jQuery代码来发送和接收JSON:
function gaeQuery(request) {
var url = "/query";
var payload = {'jsondata' : JSON.stringify(request)};
$.post(
url,
payload,
function(response) {
procesResponse(response);
}, // succes response callback
'json', // response contains JSON content, and will be decoded in a js object
{
contentType: "application/json;charset=utf-8", // send JSON content
timeout: 20000,
tryCount: 0,
retryLimit: 3, // max 3 retries
error: function(xhr, textStatus, errorThrown) { // error handling callback
if (textStatus === 'timeout') {
this.tryCount++;
if (this.tryCount <= this.retryLimit) { //try again until retryLimit
$.ajax(this);
return;
}
alert('We have tried ' + this.retryLimit + ' times and it is still not working. We give in. Sorry.');
return;
}
if (xhr.status === 500) { // internal server error
alert('Oops! There seems to be a server problem, please try again later.');
}
else {
alert('Oops! There was a problem, sorry.'); // something went wrong
}
}
}
);
}
行,所以我设法弄清楚这一点,我想我会张贴工作对我来说帮助任何人寻找这个信息,因为webapp2的文档,当谈到“让”发布JSON数据是不是有用的答案。
在客户端,我做了以下内容:
var request = $.ajax({
url: "/some/url/",
type: "POST",
data: JSON.stringify([{someval: val1, someval2:val2, someval3:val3}]),
contentType: "application/json",
dataType: 'json',
beforeSend: function() {
$('#loading-div').show();
},
complete: function(){
$('#loading-div').hide();
},
success: function(response, textStatus, jqXHR){}
});
我不能找出问题马上的原因是因为以下行,我有一些注释掉线,可以发布后重定向阻止页面一并删除的。 这是所有的怪异,不相关的和无益的错误消息的来源:
event.preventDefault();
在服务器端获取被张贴JSON数据到AppEngine上做到以下几点:
jdata = json.loads(cgi.escape(self.request.body))
for vals in jdata:
val1 = vals['someval']
val2 = vals['someval2']
val3 = vals['someval3']
以上是我没有做是正确的,并没有在客户端上一行的问题的根源没有办法弄明白。
不管怎么说,一旦你拥有的数据做你需要做它,一旦你完成,需要发回一个JSON响应添加下列行的任何处理:
//the data would look something like this
data = {'return_value': val1, 'return_value2': val2,
'return_value3': val3, 'return_value4': val4}
return_data = json.dumps(data)
self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
self.response.write(return_data)
在客户端几乎忘了再次访问来自与jQuery服务器发回的变量,它非常简单...做这样的事情:
success: function(response, textStatus, jqXHR){
console.log(response.return_value);
console.log(response.return_value2);
console.log(response.return_value3);
}
希望这会帮助别人寻找这些信息。