0

我有 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读取格式化的请求正文?或者更具体地说,我怎样才能逐行而不是一次读取请求正文?

4

1 回答 1

2

我无法想象 CherryPy 会这样处理数据。

您写出换行计数的测试表明,更有可能curl发送的数据没有完整地换行,并且当您的请求处理程序拥有它时,所有换行都已被剥离(因此raw_body.splitlines()仅返回[raw_body]导致写入一行) .

确保使用--data-binary开关 POST;-d默认为 ASCII,很可能会为您更改换行符:

-d, --data 是一样的--data-ascii。要发布纯二进制数据,您应该改用该--data-binary选项。

于 2013-02-14T16:21:04.080 回答