如何在Python中发送和接收HTTP POST请求?
我使用以下两个Python脚本尝试解决如何在Python中发送和接收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
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的内置支持是有限的。我来试试看。我仍然想知道这里发生了什么,即使只是想理解为什么这看起来是天生的缺陷。