2013-07-15 3 views
2

Может ли кто-нибудь сказать мне, что происходит с этой простой настройкой сервера? Он основан на том же коде, что и в this question, и, возможно, похожая проблема - но мне нужен запрос POST, а не GET, который был окончательным разрешением в другом вопросе? Проблема в том, что self.args пуст, когда я ожидал {'verify': 'true'}.Отправка и разбор HTTP-запроса POST с помощью Python

Вот мой запрос POST:

import requests 

url = 'http://localhost:8080/' 
data = {'verify': 'true'} 
response = requests.post(url, params=data) 

print response.text 

И обработчик, который работает на локальном хосте:

class MyHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 
     self.query_string = self.rfile.read(int(self.headers['Content-Length'])) 
     self.args = dict(cgi.parse_qsl(self.query_string)) 
     self.send_response(200) 
     self.end_headers() 
     self.wfile.write("Content-type: text/html<BR><BR>"); 
     self.wfile.write("<HTML>POST OK.<BR><BR>"); 

def main(): 
    server = HTTPServer(('', 8080), MyHandler) 
    server.serve_forever() 

if __name__ == '__main__': 
    main() 

Обработчик вывода в случае, который помогает Jamie-PC - - [15/Jul/2013 12:40:34] "POST /?verify=true HTTP/1.1" 200 -.

+0

POST-запросы (обычно) не используют строку запроса для передачи параметров. Вместо этого они передаются внутри тела запроса. –

+1

Возможный дубликат [Python: BaseHTTPRequestHandler post variables] (http://stackoverflow.com/questions/4233218/python-basehttprequesthandler-post-variables) –

+0

Спасибо. Не видел этого дубликата - я постараюсь, чтобы это работало. –

ответ

1

То, что вы, вероятно, нужно использовать data вместо params как в:

import requests 

url = 'http://localhost:8080/' 
data = {'verify': 'true'} 
response = requests.post(url, data=data) 

print response.text 

Это устанавливает все другие необходимые заголовки, как Content-Length.