-1

我觉得我错过了一些非常明显的东西,但我看不到它。

在 ipython (Python 2.7) 中,这有效:

In [1]: json.loads('[]')
Out[1]: []

我正在尝试在 Django 视图中做等效的最小示例,以说服自己在转到真实数据结构之前可以阅读 JSON:

def submit(request):
    json_string = request.GET['json']
    parsed = json.loads(json_string)

    return HttpResponse(parsed)

我通过浏览器调用它

http://localhost:8001/submit/?json='[]'

我明白了ValueError: No JSON object could be decoded

我做错了什么,我该如何调试它?这是某种编码问题吗?还是我错误地访问了 GET 的内容?或者是其他东西?

我尝试将变量转储json_string到文件和作为 HttpResponse。两次我都得到了,这看起来'[]'确实不错...

编辑:

为了方便其他想了解如何调试 POST 的初学者,Django 的错误页面在异常中返回。一个快速而讨厌的 hack 是

import os
def debug_post(post_req):

    result = None
    try:
        result = submit_to_endpoint(post_req)
    except urllib2.URLError as e:
        out_fh = open('debug_post.tmp', 'w')
        out_fh.write(e.read())
        out_fh.close()
        os.system('firefox ' + 'debug.tmp')

    return result
4

2 回答 2

3

您已在 JSON 字符串中包含单引号。没有必要这样做,尤其是单引号在 JSON 中无效。你应该去http://localhost:8001/submit/?json=[]

于 2012-10-01T11:44:18.387 回答
2

尽管即使出于测试目的 GET 似乎更容易,但对于 JSON,您应该使用 POST 请求。这在请求改变应用程序内部状态的情况下非常重要。例如/localhost/format/?json={disk_id : 1},改变应用程序状态的东西 :) 通常搜索引擎会索引网站的链接,这些链接是 GET 请求。想象一下这样的链接被搜索引擎索引:即使在索引过程中,应用程序的内部状态也可以改变。

另一个原因是 Web 服务器、代理和浏览器实现的 URLS 缓存。猜猜看,GET 请求的响应通常会被缓存。

最后但并非最不重要的一点是,GET 请求参数应该只是在查询字符串中

localhost?key1=val1&key2=val2

格式,其中val's是单值数据字段,而不是 JSON 数据。

所以,原因在于 HTTP 协议设计。您可以利用例如 AJAX 技术来发布 JSON 数据,这足以避免上述所有情况。

我建议您熟悉RESTful Web 服务的概念——一个简单而强大的设计用户到 Web 应用程序通信的概念。

于 2012-10-01T13:34:04.633 回答