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,这就是幸福的结局。
很多关于 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,这就是幸福的结局。