python requests发送POST请求带文件和json

7590阅读 0评论2021-11-02 大镇
分类:Python/Ruby

python 使用 requests 的POST方法,发送一个 带文件和 json 的请求

当同时发文件和json请求时,通常会报一个这样的错误:
 Data must not be a string” 

有两种方法,可以根据实际需要来选择:

1、不使用json转换
  1. import requests

  2. data = {
  3.     'token' : auth_token,
  4.     'info' : info,
  5. }

  6. headers = {'Content-type': 'multipart/form-data'}

  7. files = {'document': open('file_name.pdf', 'rb')}

  8. r = requests.post(url, files=files, data=data, headers=headers)

也就是,不是用json.dumps 对 data 进行格式化

*请注意,这可能不一定是您想要的,因为它将成为另一个表单数据部分

2、将json和文件放到一个参数里
★不要自己设置Content-type标头,将其留给pyrequests生成

  1. payload = {"param_1": "value_1", "param_2": "value_2"}
  2. files = {
  3.      'json': (None, json.dumps(payload), 'application/json'),
  4.      'file': (os.path.basename(file), open(file, 'rb'), 'application/octet-stream')
  5. }

  6. r = requests.post(url, files=files)
  7.  
  8. 或者
  9.    
  10. files = {
  11.     'data' : data,
  12.     'document': open('file_name.pdf', 'rb')
  13. }

  14. r = requests.post(url, files=files, headers=headers)

3、
使用 MultipartEncoder
如果接口是用 CommonsMultipartFile[] files 写的,那么用files发送就会报错,需要使用MultipartEncoder 来发送文件

  1. from requests_toolbelt import MultipartEncoder

  2. json_data = {"pig":"peity"}

  3. # 如果是zip文件

  4. fields = {'file': (file_name,open('c:\test.zip', 'rb'),'application/zip')}

  5. # 将要发送的json字典合并到fields里
  6. fields.update(json_data)
  7. # 编码
  8. myfiles = MultipartEncoder(fields)
 # 请求头里加入Content-Type
  1. head_upfile["Content-Type"] = myfiles.content_type

  2. # 数据放到 data 里来发送,而不是通过files参数
  3. rest = session.post(urls, headers=head_upfile, data=myfiles, timeout=60).text


上一篇:pymysql对 datetime的处理
下一篇:python 对字典、列表、字典列表进行排序