【发布时间】:2013-02-14 15:52:14
【问题描述】:
我有 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读取格式化的请求正文?或者更具体地说,我怎样才能逐行而不是一次全部读取请求正文?
【问题讨论】:
-
将
raw_body.count('\n')之类的内容写入文件时会发生什么? -
@MartijnPieters 当我添加
f.write(str(raw_body.count('\n')))时,我得到0。即使我明确地将\n添加到行尾,我仍然会得到0。 cherrpy 是否可以事先进行某种预处理? -
这意味着
raw_body确实 not 在其中包含换行符,因此.splitlines()在列表中返回raw_body不变,并且您将其写出文件为一条线。您是否 100% 确定curl正在使用\n换行符发送数据? -
@MartijnPieters 就是这样。显然,如果您希望您的数据完全按照
curl的格式发送,您必须使用--data-binary标志。如果你想回答,我会接受。非常感谢! -
啊,确实;
--data-ascii会弄乱换行符。在那里,制定了答案。 :-)
标签: python json rest curl cherrypy