ValueError:数据不能是字符串

时间:2014-12-18 18:14:49

标签: python python-requests

我正在尝试使用requests执行以下操作:

data = {'hello', 'goodbye'}
json_data = json.dumps(data)
headers = {
        'Access-Key': self.api_key,
        'Access-Signature': signature,
        'Access-Nonce': nonce,
        'Content-Type': 'application/json',
        'Accept': 'text/plain'
    }
r = requests.post(url, headers=headers, data=json_data, 
                 files={'file': open('/Users/david/Desktop/a.png', 'rb')})

但是,我收到以下错误:

ValueError: Data must not be a string.

请注意,如果我删除files参数,则会根据需要运行。如果包含requests,为什么赢了files允许我为数据发送json编码的字符串?

请注意,如果我将data更改为普通的python字典(而不是json编码的字符串),则上述工作正常。所以似乎问题是如果文件不是json编码的,那么数据不能被json编码。但是,我需要对我的数据进行编码,以匹配由API创建的哈希签名。

3 个答案:

答案 0 :(得分:3)

当您将正文指定为JSON字符串时,您无法再附加文件,因为文件上载需要MIME类型multipart/form-data

您有两种选择:

  1. 将JSON字符串封装为表单数据(类似json => json.dumps(data)
  2. 的一部分
  3. 在Base64中对文件进行编码,并在JSON请求正文中进行传输。这个looks like a lot of work虽然。

答案 1 :(得分:0)

此问题的替代解决方案是将数据作为文件发布。

  1. 您可以将字符串作为文件发布。在这里阅读更多: http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

  2. 以下说明如何发布多个文件: http://docs.python-requests.org/en/latest/user/advanced/#post-multiple-multipart-encoded-files

答案 2 :(得分:0)

删除以下内容对我有帮助:

'Content-Type': 'application/json'

然后将数据作为字典传递