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 和 HTTP“post”代码转换为 Swift 3 时出错