Python BaseHTTPRequestHandler: ответ с JSON
У меня есть класс Python, который наследует BaseHTTPRequestHandler
и реализует метод do_POST
,
В настоящее время мне удается ответить только с целочисленным статусом, например, 200, используя следующую команду в конце метода:
self.send_response(200)
Я пытаюсь также отправить некоторую строку как часть ответа. Как я должен это делать?
2 ответа
Оказывается, все довольно просто, хотя примеров для этого немного.
Просто используйте:
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)
По крайней мере, в моей среде (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'))
в противном случае будет выдана эта ошибка: TypeError: требуется объект, похожий на байты, а не 'str'
Это старый вопрос. Тем не менее, если кому-то еще может быть интересно то же самое, вот мои 2 цента.
Если вы делаете что-то полезное, помимо игры с python, вы должны начать искать стандартные платформы python для обработки операций HTTP-сервера, такие как Django или Flask.
При этом есть небольшая заглушка, которую я использую в качестве тестового сервера для моих исходящих запросов, которая должна ответить на ваш вопрос. Вы можете установить любой код состояния, заголовок или тело ответа, изменив его:
#!/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
С учетом вышесказанного, чтобы делать то, что вы делаете, лучше делать все правильно с самого начала, чтобы избежать больших переделок в будущем. Используйте каркас, способный обрабатывать типичные для вас вещи.