python获取post请求_Python http.server中获取Post的请求报文

今天在自学http.server请求命令, 各个字段都很好理解, 但唯独想打印获取Post请求报文时, 被难住了, 网上找了很多帖子, 官方的文档也刷了几遍, 但没有一个明确的答复. 后来不经意间看到一个帖子, 才发现此处有坑.

上代码:

from http.server import HTTPServer, BaseHTTPRequestHandler

import json

class Resquest(BaseHTTPRequestHandler):

def handler(self):

print("data:", self.rfile.readline().decode())

self.wfile.write(self.rfile.readline())

def do_GET(self):

print(self.requestline)

if self.path != '/hello':

self.send_error(404, "Page not Found!")

return

data = {

'result_code': '1',

'result_desc': 'Success',

'timestamp': '',

'data': {'message_id': '25d55ad283aa400af464c76d713c07ad'}

}

self.send_response(200)

self.send_header('Content-type', 'application/json')

self.end_headers()

self.wfile.write(json.dumps(data).encode())

def do_POST(self):

print(self.headers)

print(self.command)

req_datas = self.rfile.read(int(self.headers['content-length'])) #重点在此步!

print(req_datas.decode())

data = {

'result_code': '2',

'result_desc': 'Success',

'timestamp': '',

'data': {'message_id': '25d55ad283aa400af464c76d713c07ad'}

}

self.send_response(200)

self.send_header('Content-type', 'application/json')

self.end_headers()

self.wfile.write(json.dumps(data).encode('utf-8'))

if __name__ == '__main__':

host = ('', 9002)

server = HTTPServer(host, Resquest)

print("Starting server, listen at: %s:%s" % host)

server.serve_forever()

这里要注意的是, 有些人说获取请求的报文, 只需要 self.rfile.read() 即可, 但实际上这样写了以后, 每次执行到这里就会卡死, 国外有帖子说需要等待30s, 拜托, 这个是服务器, 一个普通的请求等30s?? 后来才知道, 这里如果加上只读取报文长度字符串, 打印即可. 这样就完美解决.

希望能帮助一些还在此坑中的人.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您输入的是一个 POST 请求,您可以尝试使用以下 PHP 代码将其转换为 Python requests 格式: ```php <?php if($_SERVER['REQUEST_METHOD'] == 'POST') { $request = $_POST['request']; // 解析请求 $lines = explode("\r\n", $request); $method = ''; $url = ''; $headers = []; $data = ''; foreach($lines as $line) { if(empty($method)) { $request_line = explode(' ', $line); $method = $request_line[0]; $url = $request_line[1]; } else { if($line === '') { // 请求头和请求体数据之间有一个空行 $data = implode("\r\n", array_slice($lines, array_search('', $lines) + 1)); break; } else { // 解析请求头 $header = explode(': ', $line); $headers[] = [ 'name' => $header[0], 'value' => $header[1] ]; } } } // 将请求转换为 Python requests 格式 $python_code = 'import requests' . PHP_EOL; $python_code .= 'url = "' . $url . '"' . PHP_EOL; $python_code .= 'headers = {' . PHP_EOL; foreach($headers as $header) { $python_code .= ' "' . $header['name'] . '": "' . $header['value'] . '",' . PHP_EOL; } $python_code .= '}' . PHP_EOL; if($method == 'GET') { $python_code .= 'response = requests.get(url, headers=headers)' . PHP_EOL; } else { $python_code .= 'data = ' . var_export($data, true) . PHP_EOL; $python_code .= 'response = requests.post(url, headers=headers, data=data)' . PHP_EOL; } $python_code .= 'print(response.content)' . PHP_EOL; // 输出转换后的 Python 代码 echo '<pre>' . htmlspecialchars($python_code) . '</pre>'; } ?> <form method="post"> <label>POST 请求:</label><br> <textarea name="request" rows="10" cols="50"></textarea><br> <input type="submit" value="提交"> </form> ``` 这段代码会在页面上显示一个输入框,您可以在其输入 POST 请求。当您点击提交按钮时,它会将请求转换为 Python requests 格式,并把转换后的 Python 代码输出到页面上。请注意,这个代码只是一个简单的示例,您需要根据您实际的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值