没有JSON对象可以解码 - RPC POST调用

时间:2012-04-02 01:41:45

标签: google-app-engine json-rpc

var body = JSON.stringify(params);

// Create an XMLHttpRequest 'POST' request w/ an optional callback handler
req.open('POST', '/rpc', async);

req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", body.length);
req.setRequestHeader("Connection", "close");

if (async) {
  req.onreadystatechange = function() {
    if(req.readyState == 4 && req.status == 200) {
      var response = null;
      try {
        response = JSON.parse(req.responseText);
      } catch (e) {
        response = req.responseText;
      }
      callback(response);
    }
  };
}

// Make the actual request
req.send(body);

----在服务器端----

class RPCHandler(BaseHandler):        
'''@user_required'''
def post(self):
    RPCmethods = ("UpdateScenario", "DeleteScenario")
    logging.info(u'body ' + self.request.body)
    args = simplejson.loads(self.request.body)

----在服务器日志上收到以下错误 body%5B%22UpdateScenario%22%2C%22c%22%2C%224.5%22%2C%2230frm%22%2C%22 Refinance%22%2C%22100000%22%2C%22740%22%2C%2294538%22% 2C%2250000%22%2C%22owner%22%2C%22sfr%22%2C%22Fremont%22%2C%22CA%22%5D =

无法解码JSON对象:第1行第0列(字符0): Traceback(最近一次调用最后一次):   在致电中输入文件“/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py”,第703行     handler.post(*基团)   文件“/base/data/home/apps/s~mortgageratealert-staging/1.357912751535215625/main.py”,第418行,在帖子中     args = json.loads(self.request.body)   在负载中输入文件“/base/python_runtime/python_lib/versions/1/simplejson/init.py”,第388行     return _default_decoder.decode(s)   文件“/base/python_runtime/python_lib/versions/1/simplejson/decoder.py”,第402行,解码     obj,end = self.raw_decode(s,idx = _w(s,0).end())   在raw_decode中输入文件“/base/python_runtime/python_lib/versions/1/simplejson/decoder.py”,第420行     引发JSONDecodeError(“无JSON对象可被解码”,s,idx) JSONDecodeError:无法解码JSON对象:第1行第0列(char 0)

---萤火虫显示以下内容---

参数application / x-www-form-urlencoded [ “UpdateScenario”, “C”,“4 ....
资源 [ “UpdateScenario”, “C”, “4.5”, “30frm”, “再融资”, “100000”, “740”, “94538”, “50000”, “老板”, “SFR”, “弗里蒙特”,” CA“]

根据firebug报告,日志显示self.request.body如预期。然而,simplejson load并不喜欢它。

请帮忙!

2 个答案:

答案 0 :(得分:2)

两个选项:

似乎你需要逃避self.request.body的内容。

导入urllib并将示例中的最后一行代码更改为:

args = simplejson.loads(urllib.unquote(self.request.body))

或者您可以尝试其他选项:您正在POST主体中发送完整的json字符串。您可能不需要在javascript中包含以下行:

req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

取出它,看看你是否还需要使用上面的urllib.unquote解决方案。

答案 1 :(得分:0)

您不发送JSON内容。您必须添加此标头:contentType:'application / json'