Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2268607
  • 博文数量: 293
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2170
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-31 14:30
个人简介

自己慢慢积累。

文章分类

全部博文(293)

分类: Python/Ruby

2021-11-02 15:56:19

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


阅读(7583) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~