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

2024-03-28 19:14:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个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()导致客户端挂起,直到从服务器接收到响应为止。在服务器上的函数完成执行之前,似乎不会收到响应。


Tags: importself服务器sendlocalhost客户端closeread
1条回答
网友
1楼 · 发布于 2024-03-28 19:14:24

你最初的例子有几个问题。第一种情况是,如果使用request方法,则应该包含要在该调用中发送的消息体,而不是单独调用send。documentation notes send()可用作request替代选项:

As an alternative to using the request() method described above, you can also send your request step by step, by using the four functions below.

你只要conn.request("POST", "/testurl", "clientdata")

第二个问题是您试图读取发送到服务器的内容的方式。self.rfile.read()试图读取来自客户端的整个输入流,这意味着它将阻塞直到流关闭。在连接关闭之前,流不会关闭。你要做的就是准确地读取从客户端发送的字节数,就这样。你怎么知道那是多少字节?当然,标题是:

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

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

相关问题 更多 >