2013-12-19 86 views
1

我想在python中编写简单的应用程序,他们会使用POST HTTP方法向服务器发送一些文本,然后获取包含一些文本的响应。无法从POST请求获取响应正文python

服务器:

from http.server import * 
class MyServer(BaseHTTPRequestHandler): 

    def do_POST(self): 
     self.send_response(200) 
     self.send_header("Content-type","text/plain") 
     self.end_headers() 
     print(self.rfile.read().decode("UTF-8")) 
     self.wfile.write(bytes("TEST RESPONSE", "UTF-8")) 

address = ("",8000) 
httpd = HTTPServer(address, MyServer) 
httpd.serve_forever() 

客户:

import http.client 
class client: 
    def __init__(self): 
     h = self.request("127.0.0.1:8000", "POST", "OH YEA") 
     resp = h.getresponse() 
     print(resp.status) 
     #data = resp.read() 


    def request(self, host, metoda, strona): 
     headers = { "Host" : host, "Accept": r"text/plain" } 
     h = http.client.HTTPConnection(host) 
     h.request(metoda,"",strona,headers) 
     return h 

a = client() 

那么只要行数据= resp.read()保持评论的一切工作正常(以及服务器GET请求打印到控制台体它并发送响应),但是当我尝试读取响应身体服务器不打印请求正文,我不明白,即使我得到响应状态200我不能读取响应身体(以及整个应用程序“挂断”)。我究竟做错了什么?我猜测,服务器的行为与未完成的响应处理有关,但我无法完成它因为我无法得到响应身体。

回答

1

您错过了HTTP响应中的Content-Length标题。 HTTP客户端不知道响应完成时,所以它不断等待更多:

def do_POST(self): 
    content = bytes("TEST RESPONSE", "UTF-8") 
    self.send_response(200) 
    self.send_header("Content-type","text/plain") 
    self.send_header("Content-Length", len(content)) 
    self.end_headers() 
    print(self.rfile.read().decode("UTF-8")) 
    self.wfile.write(content) 

这完全不起作用,但:服务器有同样的问题:它只是不断从阅读rfile

def do_POST(self): 
    content = bytes("TEST RESPONSE", "UTF-8") 
    self.send_response(200) 
    self.send_header("Content-type","text/plain") 
    self.send_header("Content-Length", len(content)) 
    self.end_headers() 
    print(self.rfile.read(int(self.headers['Content-Length'])).decode("UTF-8")) 
    self.wfile.write(content) 

使用curl,这工作得很好:

$ curl -X POST http://localhost:8000 -d 'testrequest' 
TEST RESPONSE 

有办法做到这一点没有Content-Length头,但一开始,这已经足够了。

编辑:这是一个很好的锻炼编写HTTP客户端/服务器,但对于生产使用,你可能要考虑更高层次的抽象,如requests为客户端和WSGI或完整的web框架对于服务器端(根据您的要求,FlaskDjango是流行的选择)。

+1

我的上帝的男人我很喜欢你:)因为http://docs.python.org/2/library/httplib.html我认为内容长度设置为automaticaly。现在它当然有效:)谢谢你:)顺便说一句:圣诞快乐,新年快乐! – user2184057

+0

谢谢:-)我可能对客户端的“Content-Length”有错,您是否尝试过而不手动设置它?我只是看着文档,它应该工作:-)顺便说一句。 [这是Python 3.x的文档](http://docs.python.org/3/library/http.html),你正在阅读2.x版本 – sk1p

相关问题