Python BaseHTTPRequestHandler:响应 JSON
Python BaseHTTPRequestHandler: Respond with JSON
我有一个 Python class 继承了 BaseHTTPRequestHandler
并实现了方法 do_POST
.
我目前只成功回复了一个整数状态,例如200,在方法末尾使用以下命令:
self.send_response(200)
我也在尝试发送一些字符串作为响应的一部分。我应该怎么做?
事实证明它很简单,虽然没有太多例子。
只需使用:
self.wfile.write(YOUR_STRING_HERE)
具体针对json的情况:
import json
json_string = json.dumps(YOUR_DATA_STRUCTURE_TO_CONVERT_TO_JSON)
self.wfile.write(json_string)
这是一个老问题。尽管如此,如果其他人可能也有同样的疑问,这是我的 2 美分。
如果您正在做任何有用的事情,除了使用 python,您应该开始寻找标准 python 框架来处理 HTTP 服务器操作,例如 Django 或 Flask。
话虽这么说,但我使用一个小存根作为我的传出请求的测试服务器,它应该可以回答您的问题。你可以通过修改来设置任意状态码、header或response body:
#!/usr/bin/env python
# Reflects the requests with dummy responses from HTTP methods GET, POST, PUT, and DELETE
# Written by Tushar Dwivedi (2017)
import json
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from optparse import OptionParser
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
request_path = self.path
print("\n----- Request Start ----->\n")
print("request_path :", request_path)
print("self.headers :", self.headers)
print("<----- Request End -----\n")
self.send_response(200)
self.send_header("Set-Cookie", "foo=bar")
self.end_headers()
self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))
def do_POST(self):
request_path = self.path
# print("\n----- Request Start ----->\n")
print("request_path : %s", request_path)
request_headers = self.headers
content_length = request_headers.getheaders('content-length')
length = int(content_length[0]) if content_length else 0
# print("length :", length)
print("request_headers : %s" % request_headers)
print("content : %s" % self.rfile.read(length))
# print("<----- Request End -----\n")
self.send_response(200)
self.send_header("Set-Cookie", "foo=bar")
self.end_headers()
self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))
do_PUT = do_POST
do_DELETE = do_GET
def main():
port = 8082
print('Listening on localhost:%s' % port)
server = HTTPServer(('', port), RequestHandler)
server.serve_forever()
if __name__ == "__main__":
parser = OptionParser()
parser.usage = ("Creates an http-server that will echo out any GET or POST parameters, and respond with dummy data\n"
"Run:\n\n")
(options, args) = parser.parse_args()
main()
再说一次,即使你只是在学习,甚至需要在上面添加5-6个if else
来做你正在做的事情,最好从一开始就做正确的事情,以避免将来进行大量返工。使用能够为您处理样板文件内容的框架。
至少在我的环境中(Python 3.7)我必须使用
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json_str.encode(encoding='utf_8'))
否则会抛出这个错误:
类型错误:需要一个类似字节的对象,而不是 'str'
我有一个 Python class 继承了 BaseHTTPRequestHandler
并实现了方法 do_POST
.
我目前只成功回复了一个整数状态,例如200,在方法末尾使用以下命令:
self.send_response(200)
我也在尝试发送一些字符串作为响应的一部分。我应该怎么做?
事实证明它很简单,虽然没有太多例子。
只需使用:
self.wfile.write(YOUR_STRING_HERE)
具体针对json的情况:
import json
json_string = json.dumps(YOUR_DATA_STRUCTURE_TO_CONVERT_TO_JSON)
self.wfile.write(json_string)
这是一个老问题。尽管如此,如果其他人可能也有同样的疑问,这是我的 2 美分。
如果您正在做任何有用的事情,除了使用 python,您应该开始寻找标准 python 框架来处理 HTTP 服务器操作,例如 Django 或 Flask。
话虽这么说,但我使用一个小存根作为我的传出请求的测试服务器,它应该可以回答您的问题。你可以通过修改来设置任意状态码、header或response body:
#!/usr/bin/env python
# Reflects the requests with dummy responses from HTTP methods GET, POST, PUT, and DELETE
# Written by Tushar Dwivedi (2017)
import json
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from optparse import OptionParser
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
request_path = self.path
print("\n----- Request Start ----->\n")
print("request_path :", request_path)
print("self.headers :", self.headers)
print("<----- Request End -----\n")
self.send_response(200)
self.send_header("Set-Cookie", "foo=bar")
self.end_headers()
self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))
def do_POST(self):
request_path = self.path
# print("\n----- Request Start ----->\n")
print("request_path : %s", request_path)
request_headers = self.headers
content_length = request_headers.getheaders('content-length')
length = int(content_length[0]) if content_length else 0
# print("length :", length)
print("request_headers : %s" % request_headers)
print("content : %s" % self.rfile.read(length))
# print("<----- Request End -----\n")
self.send_response(200)
self.send_header("Set-Cookie", "foo=bar")
self.end_headers()
self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))
do_PUT = do_POST
do_DELETE = do_GET
def main():
port = 8082
print('Listening on localhost:%s' % port)
server = HTTPServer(('', port), RequestHandler)
server.serve_forever()
if __name__ == "__main__":
parser = OptionParser()
parser.usage = ("Creates an http-server that will echo out any GET or POST parameters, and respond with dummy data\n"
"Run:\n\n")
(options, args) = parser.parse_args()
main()
再说一次,即使你只是在学习,甚至需要在上面添加5-6个if else
来做你正在做的事情,最好从一开始就做正确的事情,以避免将来进行大量返工。使用能够为您处理样板文件内容的框架。
至少在我的环境中(Python 3.7)我必须使用
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json_str.encode(encoding='utf_8'))
否则会抛出这个错误: 类型错误:需要一个类似字节的对象,而不是 'str'