这是我的测试命令:
curl -v -A 'TEST/1.0' -X POST -d 'events=[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
这是我的RequestHandler
class MyWebhookHandler(webapp2.RequestHandler):
def post(self):
events_json = self.request.get('events')
event_datum = json.loads(events_json) # exception here
每当我到达json.loads
行时,我都会遇到此异常:
event_datum = json.loads(events_json)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Unterminated string starting at: line 1 column 27 (char 26)
如何阻止此例外?
修改
问题可能与self.request.get('events')
有关,而不是json库。函数调用返回
[{"event":"reset", "test":"reset
而不是
[{"event":"reset", "test":"reset;123"}]
答案 0 :(得分:0)
其他用户未提供正确答案。问题不是你需要使用不同的python函数来获取POST请求参数 - get
是正确的函数,可以在这里使用以获取请求字符串 - 问题是你没有发送有效的JSON对象。您正在发送一个javascript表达式,将JSON对象分配给变量events
。 JSON是javascript表达式的子集,但不是一回事。
相反,你应该使用:
curl -v -A 'TEST/1.0' -X POST -d '[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
或
curl -v -A 'TEST/1.0' -X POST -d '{"events":[{"event":"reset", "test":"reset;123"}]}' 'http://127.0.0.1:8080/_api'
答案 1 :(得分:-1)
';'在后数据中被视为分隔符,以同样的方式'&'通常会是,因此'events'的值在该点结束,并且123"}]
将存在空值。
你应该在你的curl行编码字符串:
'events=[{"event":"reset", "test":"reset%38123"}]'
如果您使用$ .post通过jQuery执行帖子,则此编码会自动发生。
答案 2 :(得分:-2)
您在请求中发送了一个列表,而不是您应该使用的字符串events=[{"event":"reset", "test":"reset;123"}]
'{"events":[{"event":"reset", "test":"reset;123"}]}'