Python HTTPServer, отвечающий на curl, но не на запрос Postman GET

#python-3.x #get #postman #httpserver

#python-3.x #получить #postman #httpserver

Вопрос:

Рассмотрим простой сервер на Python3 с модулем BaseHTTPRequestHandler .

 import json
import urllib.parse
from http.server import BaseHTTPRequestHandler, HTTPServer
import bson.json_util

class GetHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        print("/n=================================")
        json_string = '{"hello":"world"}'
        self.wfile.write(json_string.encode())
        self.send_response(200)
        self.end_headers()
        return

if __name__ == '__main__':
    #from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 3030), GetHandler)
    print ('Starting server, use <Ctrl-C> to stop')
    server.serve_forever()
  

Это правильный ответ с curl терминала:

 curl -i http://localhost:3030/
  

Однако при попытке отправить запрос от Postman он не отвечает. Я попробовал URL localhost:3030/ , http://localhost:3030/ а также с обратным адресом.

Почему это?

Комментарии:

1. Я думаю, что у curl и postman разные пользовательские агенты, что может привести к различиям в способе реагирования сервера. Проверьте также, что Postman отправляет GET, а не POST.

2. вы можете увидеть фактическую команду и тело, используемые postman для выполнения запроса. пожалуйста, опубликуйте это здесь.

3. Как я могу это сделать?

4. Можете ли вы перехватить оба запроса с помощью чего-то вроде fiddler и посмотреть, в чем разница?

5. Нет необходимости использовать fiddler. Postman имеет встроенную консоль, которая отображает детали каждого запроса.

Ответ №1:

Во всех примерах, которые я видел, не указывался тип содержимого, поэтому я поступил так же, и, увидев, что curl сработало, я не слишком беспокоился.

Однако тип контента должен быть указан: добавление этих строк перед self.wfile.write(...) решает проблему:

 self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
  

Пожалуйста, обратите внимание, что на самом деле self.send_response(200) был перемещен, а не добавлен.