2013-02-14 5 views
0

나는 다음과 같은 형식으로 내 서버에 오는 것입니다 JSON 데이터가 :이 유효한 JSON 형식이 아닌 내가 통제 할 수 없다는 것을 깨닫게하는 동안읽기 JSON 데이터 라인

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

을 이 데이터가 어떻게 도달하고 있는지 데이터를 라인 단위로 읽을 수 있어야합니다.

이제는 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 데이터를 포함하고 여기에 POST 요청을 처리하는 기능입니다. cherrypy이 같은 \n 같은 라인 구분 기호를 무시 몸을 읽을 때 것처럼 보인다

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

: 나는 200 응답은, 그러나, 파일에서 읽은 모든 데이터가 한 줄 아래처럼에 얻을. cherrypy가 포맷 된대로 요청 본문을 읽게하려면 어떻게해야합니까? 또는 더 구체적으로 요청 본문을 한 번에 한 줄씩 읽지 않고 한 번에 모두 읽을 수있는 방법은 무엇입니까?

+0

'raw_body.count ('\ n')'같은 것을 파일에 쓸 때 어떻게됩니까? –

+0

@MartijnPieters'f.write (str (raw_body.count ('\ n'))))''나는'0'을 추가합니다. 선의 끝에 \ n을 명시 적으로 추가하더라도 여전히'0'을 얻습니다. cherrpy가 사전 처리 작업을하기 전에 할 수 있습니까? –

+0

즉'raw_body'는 개행 문자가 없으므로'.splitlines()'는 목록에서 변경되지 않은 raw_body를 반환하고, 한 줄로 파일에 출력합니다. 'curl'이'\ n' 개행 문자로 데이터를 보내는 것을 100 % 확실합니까? –

답변

3

그런 CherryPy mangling 데이터를 상상할 수 없습니다.

줄 바꿈 계산을 작성하는 귀하의 테스트가 훨씬 더 아마 curl 그대로 개행 문자로 데이터를 전송하지 않는 것을 보여주고, 시간에 의해 요청 핸들러는 모든 줄 바꿈이 박탈 된 것이있다 (그래서 raw_body.splitlines()[raw_body]을 반환 하나의 라인이 쓰여짐).

--data-binary 스위치로 POST하십시오. -d 기본값은 ASCII하고 아주 잘 당신을 위해 줄 바꿈을 변경 할 수 있습니다 :

-d, --data--data-ascii과 동일합니다. 순전히 바이너리를 게시하려면 --data-binary 옵션을 사용해야합니다.

+0

많은 도움이되는 Yeap – PepperoniPizza