Python ValueError:数据不能是字符串
我正在尝试对Python ValueError:数据不能是字符串,python,python-requests,Python,Python 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
请求执行以下操作
:
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
参数,它将根据需要工作。如果包含文件
,为什么请求
不允许我发送数据的json编码字符串
请注意,如果我将
data
更改为普通的python字典(而不是json编码的字符串),则上述方法可以正常工作。因此,问题似乎在于,如果文件不是json编码的,那么数据就不能进行json编码。但是,我需要对数据进行编码,以匹配API创建的哈希签名。当您将正文指定为JSON字符串时,您不能再附加文件,因为文件上载需要MIME类型多部分/表单数据
您有两个选择:
将JSON字符串封装为表单数据的一部分(类似于JSON=>JSON.dumps(data)
)
在Base64中对文件进行编码,并在JSON请求体中传输。但这是事实
这个问题的替代解决方案是将数据作为文件发布
您可以将字符串作为文件发布。请在此处阅读更多信息:
下面介绍了如何发布多个文件:
在我的案例中,删除以下内容有助于我:
'Content-Type': 'application/json'
然后数据应该作为字典传递您是否尝试过data=data
?(没有json编码)是的,但是它会破坏API签名(其他方法都依赖于此)。您需要指定头,以便模块知道它是json字符串。有关详细信息,请参阅。@tyteen4a03--不,不是这样。我已经有了这些标题。这与传递的数据是字符串有关,但传递的文件不是。@David542您现在的头是什么?谢谢,但是当我尝试对图像数据执行json.dumps时,它返回一个UnicodeDecodeError
。是否有人能展示tyteen4a03建议的上述封装示例?将JSON字符串封装为表单数据的一部分(类似于JSON=>JSON.dumps(数据))