關于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]>
在 localhost 服務器上,我確實看到了 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 -
非常感謝任何幫助,謝謝。
uj5u.com熱心網友回復:
原來我錯過了很多東西。這是服務器代碼。它將接收 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,這就是幸福的結局。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464821.html
上一篇:如何將資訊(資料)從FastAPI服務器(客戶端)發送到另一個FastAPI(模型)
下一篇:R資料框中不同組的卡方檢驗
