2011-06-10 7 views
7

현재 다른 사람이 작성한 코드를 사용하고 있습니다. httplib을 사용하여 서버에 요청합니다. 메시지 본문, 헤더 값 등과 같은 올바른 형식으로 제공된 모든 데이터가 있습니다.Python httplib 및 POST

문제는 POST 요청을 보낼 때마다 데이터가 거기에 있다는 것입니다. 그러나 클라이언트 측 서버에는 아무 것도 도착하지 않습니다. 라이브러리 사양을 읽었으며 사용법이 올바른 것 같습니다.

import httplib 

conn = httplib.HTTPConnection('monkeylabs.pl', 80) 
conn.connect() 
request = conn.putrequest('POST', '/api/snippet/') 
headers = {} 
headers['Content-Type'] = 'application/json' 
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03' 
headers['Accept'] = '*/*' 
for k in headers: 
    conn.putheader(k, headers[k]) 
conn.endheaders() 

conn.send('[{"id":"route"}]') 

resp = conn.getresponse() 
print resp.status 
print resp.reason 
print resp.read() 

conn.close() 

이 몇 가지 알려진 문제, 또는 무엇인가 : 다음과 같이

추출 된 라이브러리 호출

갈? 파이썬 2.7을 사용하고 있습니다. httplib의 버전을 확인하는 방법을 모릅니다.

정말 비슷한 것이 아닌 한 (httplib2 아마도) httpsib를 다른 것으로 교환하지 않으십시오. 제가 말했듯이, 코드는 제 것이 아니며 위에 게시 한 것보다 훨씬 많은 양이됩니다. 리팩토링하면 큰 문제가 발생할 수 있습니다. 신뢰할 수있는 해결 방법에 관심이 있습니다.

편집

디버그 출력 :

send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]' 
reply: 'HTTP/1.0 201 CREATED\r\n' 
header: Date: Fri, 10 Jun 2011 23:54:00 GMT 
header: Server: WSGIServer/0.1 Python/2.7.1+ 
header: Vary: Cookie 
header: Content-Type: application/json 
header: Content-Length: 0 
201 
CREATED 

하는 것으로,이 경우 비어 서버 응답하지 요청 자체에 대한 응답 실제로 회담 후 정보를 제공합니다.

[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0 

그리고 그 세 줄 :

`` 
<QueryDict: {}> 
<QueryDict: {}> 

의 아웃 :

print '`%s`' % request.raw_post_data 
print request.GET 
print request.POST 

의 주요 원인은 요청 본문 자체가 내가 로그를 얻어서 관찰 할 수있는 비어 있다는 것입니다 장고 서버. 그래서 그것은 시체를 보내려고 시도하지만 결국에는 보내지 않습니다.

EDIT (2)

좋아, 내가 덤프를 가져다가 실제로 브라우저에서 보낸 메시지에서 생략 된 '콘텐츠 길이'라는 추가 매개 변수가 말해 줬어 도서관 정기 이용. 바보 나. 추가

+2

을 BTW, 당신은 당신이이 일을 많이 디버깅을 할 수있을 거라 생각하면, ([와이어 샤크] http://www.wireshark.org/ 설치) 실제로 사용하고있는 것을 망칠 때 사용하십시오. – Darien

+0

고마워, 처음에는 믿지 않는 사람 이었지만 실제로 해결책을 찾았습니다. 다시 한 번 감사드립니다 – julkiewicz

+0

서버의 응답 : set_header ('Access-Control-Allow-Origin', '*') ???? –

답변

5

시도 : 코드에

conn.set_debuglevel(1) 

당신이 실제로 무슨 일이 일어나고 있는지 볼 수 있습니다.

0

httplib 설명서를 확인 했습니까? HTTPLIB는 표준 파이썬 라이브러리이며, 파이썬은 온라인 설명서 문제에 대해도 매우 좋다 : http://docs.python.org/library/httplib.html

해당 페이지에서 예 :

>>> import httplib, urllib 
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) 
>>> headers = {"Content-type": "application/x-www-form-urlencoded", 
...   "Accept": "text/plain"} 
>>> conn = httplib.HTTPConnection("musi-cal.mojam.com:80") 
>>> conn.request("POST", "/cgi-bin/query", params, headers) 
>>> response = conn.getresponse() 
>>> print response.status, response.reason 
200 OK 
>>> data = response.read() 
>>> conn.close() 

귀하의 예는 이것보다 더 많은 작업 것으로 나타납니다, 당신이 읽을 경우 예를 들어 putrequest과 같은 API 문서 - 샘플에 잘못 사용 된 것을 확인할 수 있습니다. 특히 기본적으로 수락 헤더를 자동으로 추가합니다.

코드를 함수 예제와 비슷하게 만들고 코드에서 사용 된 호출과 실제 예제에서 사용 된 호출을 이해하려고합니다.

+1

예, API 설명서를 읽었으므로 모든 것이 잘 보입니다. 문제는 그것이 좋지 않다는 것입니다. 브라우저 나 다른 라이브러리가 잘 작동한다고하는 다양한 다른 방법으로 만들어진 동일한 요청입니다. '수락'헤더를 제거해도 아무 것도 변경되지 않습니다. API에서 붙여 넣은 예제는 완전히 다른 작업을 수행하는 것입니다. POST가 아니며 메시지 본문을 업로드하려고 시도하지 않습니다. – julkiewicz

6

putrequest 메서드는 Content Length 헤더를 자동으로 추가하지 않으므로 직접 수행하거나 request 메서드를 사용해야합니다.

for 루프 위의 코드에 이것을 추가

headers['Content-Length'] = "%d"%(len('[{"id":"route"}]'))