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