【问题标题】:ValueError: Data must not be a stringValueError:数据不能是字符串
【发布时间】:2015-02-17 14:58:46
【问题描述】:

我正在尝试使用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 参数,它会根据需要工作。如果包含files,为什么requests 不允许我发送json 编码的数据字符串?

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

【问题讨论】:

  • 你试过data=data吗? (无 json 编码)
  • 是的,但是它搞砸了 API 签名(其他所有方法都依赖于此)。
  • 您需要指定标头,以便模块知道它是 JSON 字符串。详情请见this question
  • @tyteen4a03 -- 不,不是这样。我已经有了这些标题。它与传递的数据是字符串有关,但传递的文件不是。
  • @David542 你现在的标题是什么?

标签: python python-requests


【解决方案1】:

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

你有两个选择:

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

【讨论】:

  • 谢谢,但是当我尝试对图像数据执行 json.dumps 时,它返回一个 UnicodeDecodeError
  • 有人可以展示 tyteen4a03 上面建议的这种封装的例子吗?将您的 JSON 字符串封装为表单数据的一部分(类似于 json => json.dumps(data))
  • 请提供示例
【解决方案2】:

解决此问题的另一种方法是将数据作为文件发布。

  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

【讨论】:

    【解决方案3】:

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

    'Content-Type': 'application/json'
    

    那么数据应该作为字典传递

    【讨论】:

      【解决方案4】:

      1.只需删除该行 json_data = json.dumps(数据) 并将请求更改为 data=data

      2.删除'Content-Type': 'application/json' 里面的标题。

      这对我有用。

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多