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С учетом вышесказанного, чтобы делать то, что вы делаете, лучше делать все правильно с самого начала, чтобы избежать больших переделок в будущем. Используйте каркас, способный обрабатывать типичные для вас вещи.

Другие вопросы по тегам