我编写的Python REST服务器中的JSON响应问题

2 投票
3 回答
798 浏览
提问于 2025-04-16 07:42

为了自己的学习,我正在创建一个简单的守护进程,它将作为一个REST服务器,监听9000端口。我的第一次测试是尝试对http://localhost:9000/getsettings.json进行一个简单的GET请求。

我写的这个简单服务器能够正常接收请求,但我觉得它发送的响应可能有问题。我想把响应以JSON格式发送。下面是服务器套接字的代码。再下面是我用来发起JSON请求的jQuery代码。Python服务器中的打印语句确实打印出了有效的JSON格式的设置。但是,当页面加载时,JavaScript中的任何一个alert都没有被调用。有没有什么想法?


Python:
    def socketThread(self):
        while 1:
            sock, address = self.serverSocket.accept()
            fs = sock.makefile()
            line = fs.readline();
            if line.startswith('GET /settings.json'):
                sock.sendall("HTTP/1.0 200 OK\r\n")
                sock.sendall("Content-Type: application/json\r\n")
                settings = json.dumps(self.currentSettings) #, indent=4
                sock.sendall("Content-Length: " + str(len(settings)) + '\r\n\r\n')
                sock.sendall(settings)
                print settings
                sock.close()

JavaScript: $(document).ready(function() { $.ajax({ url: 'http://localhost:8080/settings.json', cache: false, success: function(json){ alert('json success ' + json); }, error: function(xhr, textStatus, errorThrown) { alert(xhr.statusText); } }); });

3 个回答

1

好的,问题出在jQuery这边。我的请求被跨域保护给阻挡了,因为我的请求是发往本地服务器的不同端口,所以jQuery没有获取到数据。现在我需要想办法让这个请求正常工作。谢谢大家的帮助。

2

检查一下服务器是不是有在工作,比如在你的代码里加一行 import pdb; pdb.set_trace()。我发现如果服务器没有运行(或者在其他端口上监听),jQuery 会执行成功的回调,但内容是空的。

3

你需要发送一个 200 OK 的HTTP响应,并在发送内容之前留一个空行。

你可能还需要一些HTTP头信息,比如 Content-type 这个就很常见。

不过,我建议你使用Python里的一些HTTP库,而不是自己去实现这个协议。

撰写回答