6

어떻게 원시 HTTP 게시물 STRING을 읽습니까? 게시물의 구문 분석 된 버전을 읽는 여러 솔루션을 찾았습니다. 그러나 작업중인 프로젝트는 헤더없이 원시 XML 페이로드를 제출합니다. 그래서 나는 key => value 배열로 파싱되지 않은 채로 post 데이터를 읽는 방법을 찾고자합니다.Python : BaseHTTPRequestHandler - 원시 게시물 읽기

답변

11

self.rfile.read(self.headers.getheader('content-length'))은 원시 데이터를 문자열로 반환해야한다고 생각합니다. 직접 BaseHTTPRequestHandler 클래스 내부 문서에 따르면 :

- rfile is a file object open for reading positioned at the 
start of the optional input data part; 
+2

빠른 인터넷 검색을 시도한 후이 작업은 나를 비롯한 다른 사람을 위해 실행을 차단합니다. – kwolfe

+1

콘텐츠 길이를 제공해야합니다. data = self.rfile.read (int (self.headers.getheader ('content-length'))) – kwolfe

+5

예, 죄송합니다. 그것은 rfile 객체가 소켓이기 때문에 블로킹하고,'read()'를 호출하는 것은 기본적으로 '아무것도 남지 않을 때까지 읽는다'는 것을 말하는 것이지만, 소켓이 열려있는 한 더 읽을 것이므로 멈추고 들어오는 내용을 기다린다. . 서버는 읽을 콘텐츠를 항상 지정하여 교수형을 피합니다. 미안, 내가 처음에 그걸 넣었어야 했어. – smakateer

13

self.rfile.read(int(self.headers.getheader('Content-Length'))) 문자열로 원시 HTTP의 POST 데이터를 반환합니다.

하면 무너 뜨 : 많은 사람들이 HTTP의 POST 데이터에 포함 된 바이트 방법

  1. 헤더 '콘텐츠 길이가'지정합니다.
  2. self.headers.getheader('Content-Length')은 내용 길이 (헤더 값)를 문자열로 반환합니다.
  3. 매개 변수로 전달하기 전에이 값을 self.rfile.read()으로 변환해야하므로 int() 함수를 사용하십시오.

는 또한, 만 '콘텐츠 길이'로 지정해야합니다 있도록 헤더 이름은 대소 문자를 구분합니다.

편집 :

각 헤더 필드 다음에 이름 구성 : 분명히 필드가 나는 https://tools.ietf.org/html/rfc2616 상태 이후 올바른 행동을 믿습니다 (적어도 파이썬 2.7.5에서) 대소 문자를 구분하지 않습니다 헤더 콜론 (":") 및 필드 값. 필드 이름 은 대소 문자를 구분하지 않습니다.

+0

제발 좀더 장황하게, 나는 당신이 무엇을 제안하고 있는지 전혀 모른다. –

+1

@jb : 답변에 대한 자세한 내용을 추가했습니다. 아직도 정교해야 할 구체적인 것이 있다면 알려주십시오. –

+0

@ShindhuriKuppasad, 헤더 이름은 대소 문자를 구분하지 않습니다. 다음 문은 모두 내 테스트에서 내용 길이를 반환합니다. 'self.headers.getheader ('content-length')'및'self.headers.getheader ('content-LENGTH')' – famzah