Python HTTP服务器响应curl请求但无法响应Postman的GET请求。

3

考虑一个使用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/以及使用环回地址。

为什么会这样呢?


我认为 curl 和 postman 有不同的用户代理,这可能会导致服务器响应方式的差异。同时还要检查 Postman 是否发送的是 GET 而非 POST 请求。 - Nino Filiu
你可以在这里看到Postman用于执行请求的实际命令和主体。请将其发布在此处。 - Nagashayan
我该怎么做? - roschach
你能用类似 Fiddler 的工具捕获这两个请求并查看它们的区别吗? - so cal cheesehead
不需要使用 Fiddler。Postman 具有内置控制台,显示每个请求的详细信息。 - Josh
谢谢大家。问题实际上是指定内容类型。请看我的回答。 - roschach
1个回答

2
在我看到的所有示例中,都没有指定内容类型,因此我也按照同样的方式进行了操作,并且看到curl可以工作,所以我没有太担心。
但是应该指定内容类型:在self.wfile.write(...)之前添加这些行即可解决问题:
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()

请注意,实际上self.send_response(200)已经被移动,而非添加。最初的回答中已经有这个语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接