我的json数据将以下列格式发送到我的服务器:
{"line":"one"}
{"line":"two"}
{"line":"three"}
虽然我意识到这不是有效的json格式,但我无法控制这些数据是如何传达给我的。我需要能够逐行读取数据
现在我有一个非常简单的Cherrypy服务器设置来接受POST请求。这是处理POST请求的函数:
class PostEvent(object):
exposed = True
def POST(self, **urlParams):
cl = cherrypy.request.headers['Content-Length']
raw_body = cherrypy.request.body.read(int(cl))
lines = raw_body.splitlines()
with open('log.txt', 'w') as f:
for line in lines:
f.write('%s\n' % line)
然后我只发出以下curl
命令来测试:
curl -i -k -H "Content-Type: application/json" -H "Accept: application/json" -X POST --data @test_data -u username http://test-url.com
文件test_data
包含上述指定格式的json数据。我得到200响应,但是,从文件中读取的所有数据都在一行上,如下所示:
{"line":"one"}{"line":"two"}{"line":"three"}
似乎当cherrypy正在阅读身体时,它忽略了诸如\n
之类的行分隔符。如何格式化请求主体如何获取cherrypy?或者更具体地说,我如何逐行读取请求体,而不是一次读取所有请求体?
答案 0 :(得分:3)
我无法想象CherryPy那样的数据。
你写出新行计数的测试表明,curl
更不可能没有完整的新行发送数据,并且当你的请求处理程序拥有它时,所有换行都被剥离了(所以{ {1}}只返回raw_body.splitlines()
,导致写入一行。
确保使用[raw_body]
开关进行发布; --data-binary
默认为ASCII,很可能正在改变换行符:
-d
与-d, --data
相同。要纯数据二进制发布数据,您应该使用--data-ascii
选项。