어떻게 원시 HTTP 게시물 STRING을 읽습니까? 게시물의 구문 분석 된 버전을 읽는 여러 솔루션을 찾았습니다. 그러나 작업중인 프로젝트는 헤더없이 원시 XML 페이로드를 제출합니다. 그래서 나는 key => value 배열로 파싱되지 않은 채로 post 데이터를 읽는 방법을 찾고자합니다.Python : BaseHTTPRequestHandler - 원시 게시물 읽기
답변
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;
self.rfile.read(int(self.headers.getheader('Content-Length')))
문자열로 원시 HTTP의 POST 데이터를 반환합니다.
하면 무너 뜨 : 많은 사람들이 HTTP의 POST 데이터에 포함 된 바이트 방법
- 헤더 '콘텐츠 길이가'지정합니다.
self.headers.getheader('Content-Length')
은 내용 길이 (헤더 값)를 문자열로 반환합니다.- 매개 변수로 전달하기 전에이 값을
self.rfile.read()
으로 변환해야하므로int()
함수를 사용하십시오.
는 또한, 는 만 '콘텐츠 길이'로 지정해야합니다 있도록 헤더 이름은 대소 문자를 구분합니다.
편집 :
이각 헤더 필드 다음에 이름 구성 : 분명히 필드가 나는 https://tools.ietf.org/html/rfc2616 상태 이후 올바른 행동을 믿습니다 (적어도 파이썬 2.7.5에서) 대소 문자를 구분하지 않습니다 헤더 콜론 (":") 및 필드 값. 필드 이름 은 대소 문자를 구분하지 않습니다.
제발 좀더 장황하게, 나는 당신이 무엇을 제안하고 있는지 전혀 모른다. –
@jb : 답변에 대한 자세한 내용을 추가했습니다. 아직도 정교해야 할 구체적인 것이 있다면 알려주십시오. –
@ShindhuriKuppasad, 헤더 이름은 대소 문자를 구분하지 않습니다. 다음 문은 모두 내 테스트에서 내용 길이를 반환합니다. 'self.headers.getheader ('content-length')'및'self.headers.getheader ('content-LENGTH')' – famzah
빠른 인터넷 검색을 시도한 후이 작업은 나를 비롯한 다른 사람을 위해 실행을 차단합니다. – kwolfe
콘텐츠 길이를 제공해야합니다. data = self.rfile.read (int (self.headers.getheader ('content-length'))) – kwolfe
예, 죄송합니다. 그것은 rfile 객체가 소켓이기 때문에 블로킹하고,'read()'를 호출하는 것은 기본적으로 '아무것도 남지 않을 때까지 읽는다'는 것을 말하는 것이지만, 소켓이 열려있는 한 더 읽을 것이므로 멈추고 들어오는 내용을 기다린다. . 서버는 읽을 콘텐츠를 항상 지정하여 교수형을 피합니다. 미안, 내가 처음에 그걸 넣었어야 했어. – smakateer