http post 请求 + 来自 python 中本地主机的响应

http post request + response from localhost in python

很多关于 http post 请求的问题,但我不能做一个 完整的 例子 运行.

$ tree
.
└── src
    └── main.py # <----- this is the file I want to send data to
$ cat src/main.py
from typing import Dict, List
class Handler: # <----- (Probably should inherit from some class ?!)
    def post(self, data: Dict[str, int]) -> List[str]:
        return "+++".join([k for k in data])
$ python -m http.server 8001

现在我尝试发送数据(从其他终端)

$ cat send_something.py
import requests
x = requests.post("http://localhost:8001/src/main.py", data={"name": 700, "id": 99})
print(x)

然后我收到 501 回复,这意味着我做错了什么:

$ python send_something.py
<Response [501]>

在本地主机服务器上,我 确实看到了 post 请求,但有一条错误消息:

127.0.0.1 - - [20/Apr/2022 09:29:22] code 501, message Unsupported method ('POST')
127.0.0.1 - - [20/Apr/2022 09:29:22] "POST /src/main.py HTTP/1.1" 501 -

非常感谢任何帮助,谢谢。

原来我错过了很多东西。这是服务器代码。它将接收 json 数据并对其进行一些调整作为概念证明。

import json

from typing import List

from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler

from attrs import asdict
from attrs import define

HOST = "127.0.0.1"
PORT = 8027 # <----- nailed it in the 27th try :)

@define
class Entry:

    name: str
    some_list: List[int]

class Handler(BaseHTTPRequestHandler):
    def do_POST(self):
        
        # read incoming sent data
        data = self.rfile.read(self._sent_data_size)
        
        # do something with it ...
        response = self._process(data.decode("utf-8"))

        # perpare the (json) response
        jsonbytes = self._prepare_json_response(response)
                    
        # send the (json) response back ...
        self.wfile.write(jsonbytes)

    def _process(self, data: str) -> List[Entry]:
        return [
            Entry("employee"+str(i), [d["id"], d["salary"]])
            for i, d in enumerate(json.loads(data))
        ]

    def _prepare_json_response(self, response: List[Entry]) -> bytes:
        self.send_response(200)
        self.send_header("Content-type", "application/json")
        self.end_headers()
        jsonstr = json.dumps(
            response,
            indent=4,
            default=asdict
        )
        return jsonstr.encode()

    @property
    def _sent_data_size(self) -> int:
        return int(self.headers.get("Content-Length"))

server = HTTPServer((HOST, PORT), Handler)
server.serve_forever()
server.serve_close()

客户端代码如下:

import requests

with open("input.json") as fl:
    data = json.load(fl)

x = requests.post("http://localhost:8027", json=data)
print(x.json())

服务器启动,然后客户端发送json数据(从另一个终端)。客户正确地收到了调整后的 json,这就是幸福的结局。