0

我正在将 40kb 的字典和列表字典编码为 json,然后通过 http 将其推送到 nosql 数据库。我已经使用了 jsonpickle.encode 和 json.dumps 模块来编码我的字典的内容,但是两者都导致了一个 http 错误。我尝试手动卷曲有问题的代码部分,结果是错误“-bash: syntax error near unexpected token `('”

这是一些示例代码:

import urllib2 , jsonpickle
url = "http://amazonaws.com/server/%s/_create" % item
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.
try:
    req = urllib2.Request ( url , data , { 'Content-Type' : 'application/json' } )
    f = urllib2.urlopen ( req )
except Exception as e:
    print "Error: %s" %e

以上适用于将我的字典的某些部分输入到我的 nosql 数据库中。但是,当我通过字典的其他部分发送时,这会打印“错误:HTTP 错误 400:错误请求”。这对我来说意味着数据变量/字符串中的某些内容没有正确编码。为了获得 CURL 对此问题的响应,我尝试使用 CURL 处理以下代码:

item_id = item_dictionary [ 'id' ]
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.

command = 'curl -XPOST "http://amazonaws.com/server/%s/_create" -d '"%s"' % ( nsn_id , data )
os.system(command)

这会产生错误“sh: -c: line 0: syntax error near unexpected token `('”

如果我尝试在命令行中手动键入 curl 命令,则会收到以下一组错误:
curl: (6) Could not resolve host: material; 提供节点名或服务名,或未知
curl:(6)无法解析主机:项目;提供节点名或服务名,或未知
curl: (6) 无法解析主机:的;提供节点名或服务名,或未知
curl:(3) [globbing] 位置 146 处不匹配的右大括号/括号
{"error":"MapperParsingException[Failed to parse]; 嵌套:JsonParseException[在 VALUE_STRING\ 中的意外输入结束n 在 [来源:[B@2ff246ab;行:1,列:6519]];“,”状态“:400}

所以:
1)有没有更好的方法来确保json编码过程捕获使所有括号和单引号在它们前面用'\'格式化?我应该对所有这些进行替换吗?

2) 有没有一种好方法可以使用 urllib2 以更详细的方式找出导致此错误的原因,或者我是否需要从命令行执行 CURL 以获得 bash 类型错误?

4

1 回答 1

0

要回答您的两个问题:

1) json.dumps- 假设您传递给它有效的输入 - 将始终创建一个表示有效 JSON 对象的字符串。如果您传递无效输入,它将引发异常。Python 的json模块使用非常广泛,如果存在可能导致它吐出格式无效的 JSON 字典的错误,那么现在肯定会知道(并修复)。

2) 您收到 HTTPError 是因为 Web 服务器正在返回一个HTTP 状态代码为 400 的页面以响应您的请求。不过,页面正文中可能还有一些内容,并urllib2没有丢弃。您可以调用.read()HTTPError 的方法来获取页面上的任何内容,而不是像现在一样只看到状态代码(有时这不足以理解您做错了什么)。

大多数 Web API 会在吐出错误时向您返回某种有用的解释400 - Bad Request,例如一条消息,告诉您在请求中遗漏了哪些参数。放入print e.read()你的异常块会让你看到这一点,并且可能会让你解决你当前的问题。

于 2013-01-24T19:42:00.620 回答