zoukankan      html  css  js  c++  java
  • 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?? 后来才知道, 这里如果加上只读取报文长度字符串, 打印即可. 这样就完美解决.

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

  • 相关阅读:
    爬虫--urllib,requests模块
    ADO.NET实用经验汇总
    MVC框架的优点-老外的原文翻译
    ASP.NET MVC 3: Razor的@:和语法
    html做表格只显示表格的外边框
    ASP.NET 页生命周期概述
    Asp.Net母版页元素ID不一致的体现
    Asp.Net套用母版页后元素ID不一致之个人总结
    ASP.NET 4.0配置文件中的ClientIDMode属性
    Asp.Net母版页和内容页运行机制
  • 原文地址:https://www.cnblogs.com/howardwu/p/11160436.html
Copyright © 2011-2022 走看看