0

次の形式でサーバーに送信されるjsonデータがあります。

{"line":"one"}
{"line":"two"}
{"line":"three"}

これは有効なjson形式ではないことはわかっていますが、このデータがどのように届くかを制御することはできません。データを1行ずつ読み取ることができる必要があります

これで、POSTリクエストを受け入れるための非常にシンプルなCherrypyサーバーのセットアップができました。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の応答がありますが、ファイルから読み取られたすべてのデータは、次のように1行になっています。

{"line":"one"}{"line":"two"}{"line":"three"}

Cherrypyが本文を読み取っているときは、などの行区切り文字を無視しているように見え\nます。フォーマットされたリクエスト本文をcherrypyに読み取らせるにはどうすればよいですか?または、より具体的には、リクエストの本文を一度にではなく1行ずつ読み取るにはどうすればよいですか?

4

1 に答える 1

2

そのようなCherryPyマングリングデータを想像することはできません。

改行数を書き出すテストではcurl、改行がそのままの状態でデータを送信していない可能性が非常に高く、リクエストハンドラーがすべての改行を削除するまでに(raw_body.splitlines()戻り値だけ[raw_body]で1行が書き込まれる)が示されます。 。

--data-binary必ずスイッチでPOSTしてください。-dデフォルトはASCIIであり、改行を変更する可能性があります。

-d, --data と同じ--data-asciiです。純粋にバイナリのデータを投稿するには、代わりにこの--data-binaryオプションを使用する必要があります。

于 2013-02-14T16:21:04.080 に答える