Python:如何将 HTTP POST 转换为 JSON 格式

Posted

技术标签:

【中文标题】Python:如何将 HTTP POST 转换为 JSON 格式【英文标题】:Python: How to Convert HTTP POST in JSON Format 【发布时间】:2021-08-01 10:37:49 【问题描述】:

我有一个电子设备,它充当客户端并将 json 格式的数据发送到托管在充当服务器的计算机上的应用程序。 这个应用程序是用python制作的。来自客户端的信息到达我的应用程序,但是,它不是以 json 格式到达,而是以 POST 查询格式到达。 有什么库或方法可以将此查询转换为 json 格式?我使用套接字库。

这是我的代码:

import socket
import json

HOST = '192.168.1.1'  # Standard loopback interface address (localhost)
PORT = 1000       # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024).decode('utf-8')
            print(data)

这是我运行代码时出现在控制台中的内容。

Connected by ('192.168.1.117', 52686)
POST / HTTP/1.1
Host: 192.168.1.1        
Authorization: Basic Og==
Content-Length: 335      
Connection: keep-alive   
Content-Type: application/json

"Protocol":"json","PId":"0053003","Packets":["Id":30757,"Type":"Transaction","Data":["DateTime":"2021-05-10T16:19:48","Device":1,"Side":1,"Transaction":60858,"UserId":1,"Volume":9.01,"mass":10.00,"Price":1.11,"TotalVolume":0,"TotalAmount":0,"DateTimeStart":"2021-05-10T16:19:32","Volume2":0]]

谢谢:)

【问题讨论】:

你不是基本上在问如何编写一个能够处理这个 POST 请求并将正文解析为 JSON 的 HTTP 服务器吗?真的有必要只使用套接字从头开始创建自己的服务器吗?使用http.server 有什么问题? 在我看来像 JSON。您只需要处理/忽略 HTTP 帖子标头。 @Steffen Ullrich 我对这个编程领域相当陌生。而且我不知道要使用什么库、框架或技术。 “http.server”是python库吗?抱歉,如果这是一个非常明显的问题;但我再说一遍,我对这个主题了解不多。 @LuisMars: http.server 是用于编写 HTTP 服务器的标准 Python 库。看起来你需要一个 HTTP 服务器。 【参考方案1】:

Python 中的HTTPServer 模块实现了一个 HTTP 服务器以及所有类型 HTTP 操作的 HTTP 请求的所有底层解码:GET、POST 等。它支持多线程、身份验证、多部分数据和还有很多。

以下服务器示例接收 HTTP POST 并将负载解码为 JSON。

from http.server import HTTPServer, BaseHTTPRequestHandler
import json

class MyHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        # print(self.headers)
        length = self.headers.get('content-length')
        if length and length != '0':
            try:
                data = self.rfile.read(int(length))
                root = json.loads(data.decode())
                print("JSON data:\n", json.dumps(root, indent=4))
                msg = "Got JSON data"
            except Exception as ex:
                print("ERROR:", ex)
                self.send_error(400, "Bad Content")
                return
        else:
            msg = "No data"
        payload = msg.encode()
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.send_header('Content-length', len(payload))
        self.end_headers()
        self.wfile.write(payload)

if __name__ == '__main__':

    PORT = 8000
    httpd = HTTPServer(('localhost', PORT), MyHTTPRequestHandler)
    print(f"Listening at http://localhost:PORT/")
    httpd.serve_forever()

您可以使用 curl 和这样的测试 JSON 文件来测试服务器:

curl -X POST -H "Content-Type: application/json" -d @test.json http://localhost:8000/

服务器的输出:

Listening at http://localhost:8000/
JSON data:
 
    "Protocol": "json",
    "PId": "0053003",
    "Packets": [
        
            "Id": 30757,
            "Type": "Transaction",
            "Data": [ ... ]
        
    ]

127.0.0.1 - - [05/Jun/2021 13:34:28] "POST / HTTP/1.1" 200 -

【讨论】:

以上是关于Python:如何将 HTTP POST 转换为 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 转换为 Swift Dictionary 以进行 HTTP POST

如何将请求参数转为json格式

如何将 django 表单输入转换为 python 数据?

将 json 和 HTTP“post”代码转换为 Swift 3 时出错

Python Requests post并将得到结果转换为json

IIS7.5 URL 重写:不要将 POST 转换为 GET