Dies ist ein Beispiel für die Behandlung von Post-Parametern, die auf einem Python-Server nicht funktioniert.
Serverprogramm
simple_server.py
import http.server
import socketserver
from http.server import BaseHTTPRequestHandler
import cgi
import sys
class PostHandler(BaseHTTPRequestHandler):
def do_POST(self):
sys.stderr.write("*** do_POST *** aaa\n")
try:
ff = cgi.FieldStorage(
self.rfile,
self.headers,
environ={
"REQUEST_METHOD": "POST",
"CONTENT_TYPE": self.headers["Content-Type"],
},)
key = ff.getfirst("key","")
sys.stderr.write("*** do_Post *** key = %s\n" % key)
except Exception as ee:
sys.stderr.write("*** error *** in cgi.FieldStorage ***\n")
sys.stderr.write(str(ee) + "\n")
if __name__ == '__main__':
sys.stderr.write("*** start ***\n")
PORT = 8080
with socketserver.TCPServer(("", PORT), PostHandler) as httpd:
print("serving at port", PORT)
sys.stderr.write("*** start ***\n")
httpd.serve_forever()
Server -Ausführung
python3 simple_server.py
Zugriff vom Client
curl -X POST http://localhost:8080/ -d 'key=t1855'
curl -X POST -H "Content-Type: application/json" -d '{"key":"t1855"}' http://localhost:8080/
Serverseitiger Fehler
*** error *** in cgi.FieldStorage ***
write() argument must be str, not bytes
curl -X POST -H "Content-Type: application/json" [email protected] http://localhost:8080/
in01.json
{"key":"t1855"}
Zum Testen verwendete Version (Ubuntu 19.10)
$ python3 --version
Python 3.7.5
Gleiches Ergebnis für die nächste Version (Arch Linux)
$ python3 --version
Python 3.8.1
Recommended Posts