【问题标题】:Problem with json response in Python REST server I'm writing我正在编写的 Python REST 服务器中的 json 响应问题
【发布时间】:2010-11-27 22:10:29
【问题描述】:

为了我自己的教育,我正在创建一个简单的守护进程,它将充当 REST 服务器,侦听套接字 9000。对于我的第一个测试,我尝试执行一个 REST 调用,即在 http://localhost:9000/getsettings.json 上简单地执行一个 GET。

我破解的简单服务器可以正常接收请求,但我认为它发送的响应存在问题。我正在尝试将响应作为 JSON 发送。服务器套接字的代码如下。下面是我用来发出 JSON 请求的 jQuery 代码。 Python 服务器中的 print 语句确实以 JSON 格式打印一组有效的设置。页面加载时不会调用 Javascript 中的警报。有什么想法吗?


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); } }); });

【问题讨论】:

    标签: python ajax json


    【解决方案1】:

    您需要在发送内容之前返回一个200 OK HTTP 响应和一个空行。

    您可能还需要一些 HTTP 标头(Content-type 很明显)。

    不过,我建议使用 Python 的众多 HTTP 库之一,而不是自己实现协议。

    【讨论】:

    • 我修改了 python 服务器以返回 200 OK 和 JSON 内容类型。使用似乎可以返回的 Firebug,但响应正文似乎是空的...
    • @fred - 尝试使用 Socket 的 sendall 方法 - send 并不总是发送提供的所有数据。
    • 感谢 Adam,我尝试了 sendall,但效果并没有什么不同。我很确定服务器端正在发回数据,因为当我 telnet 到它然后发出 GET /getsettings.json 它给了我这个响应:
    • HTTP/1.0 200 OK Content-Type: application/json Content-Length: 56 {"netmask": "255.255.0.0", "ipaddress": "192.168.1.153"}
    【解决方案2】:

    检查服务器是否真的被击中(例如,在你的代码中放一个import pdb; pdb.set_trace()。我发现当服务器没有运行(或者监听不同的端口... )

    【讨论】:

    • 是的,我检查了,python 服务器正在运行并且套接字正在连接。我还远程登录到服务器,它似乎可以很好地发回 json 内容。
    【解决方案3】:

    好的,问题出在 jQuery 方面,我的请求因跨域来源保护问题而受阻 - 我的请求将发送到不同端口上的 localhost,因此 jQuery 没有拉下数据。现在我需要弄清楚如何让它发挥作用。谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多