如何在Python中发送和接收HTTP POST请求?

如何在Python中发送和接收HTTP POST请求?,python,http,post,httplib,basehttpserver,Python,Http,Post,Httplib,Basehttpserver,我使用以下两个Python脚本尝试解决如何在Python中发送和接收POST请求: 客户: import httplib conn = httplib.HTTPConnection("localhost:8000") conn.request("POST", "/testurl") conn.send("clientdata") response = conn.getresponse() conn.close() print(response.read()) 服务器: from BaseH

我使用以下两个Python脚本尝试解决如何在Python中发送和接收POST请求:

客户:

import httplib

conn = httplib.HTTPConnection("localhost:8000")
conn.request("POST", "/testurl")
conn.send("clientdata")
response = conn.getresponse()
conn.close()

print(response.read())
服务器:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

ADDR = "localhost"
PORT = 8000

class RequestHandler(BaseHTTPRequestHandler):        
    def do_POST(self):
        print(self.path)
        print(self.rfile.read())
        self.send_response(200, "OK")
        self.end_headers()
        self.wfile.write("serverdata")

httpd = HTTPServer((ADDR, PORT), RequestHandler)
httpd.serve_forever()
问题是,服务器挂起self.rfile.read(),直到在客户端上调用了conn.close(),但是如果在客户端上调用了conn.close(),客户端将无法接收来自服务器的响应。这就造成了一种情况,即可以从服务器获取响应,也可以读取POST数据,但不能同时读取两者。我想我在这里遗漏了一些东西来解决这个问题

其他信息:


conn.getresponse()导致客户端挂起,直到从服务器收到响应为止。在服务器上的函数完成执行之前,不会收到响应

您最初的示例有几个问题。首先,如果使用
request
方法,则应该在该调用中包含要发送的消息正文,而不是单独调用
send
。documentation notes send()可用作请求的替代方法:

作为使用上述request()方法的替代方法,您可以 还可以使用四个功能逐步发送您的请求 下面

您只需要
conn.request(“POST”、“/testurl”、“clientdata”)

第二个问题是您试图读取发送到服务器的内容的方式
self.rfile.read()。在连接关闭之前,流不会关闭。您要做的是准确读取从客户端发送的字节数,仅此而已。你怎么知道这是多少字节?当然,标题是:

length = int(self.headers['Content-length'])
print(self.rfile.read(length))

如果您要做的不仅仅是非常基本的测试,我强烈推荐python请求库。我还建议使用比BaseHTTPServer更好的HTTP框架/服务器进行更多的基本测试(烧瓶、瓶子、龙卷风等)。

我衷心建议您查看。如果你决心重新发明轮子,那就随它去吧,但如果不是,就要认识到Python对http的内置支持是有限的。我来试试看。我仍然想知道这里发生了什么,即使只是想理解为什么这看起来是天生的缺陷。