如何解决Python POST multipart / form-data请求与Postman不同的行为
我正在尝试使用此API端点上传文件:
https://h.app.wdesk.com/s/cerebral-docs/?python#uploadfileusingpost
使用此python函数:
def upload_file(token,filepath,table_id):
url = "https://h.app.wdesk.com/s/wdata/prep/api/v1/file"
headers = {
'Accept': 'application/json','Authorization': f'Bearer {token}'
}
files = {
"tableId": (None,table_id),"file": open(filepath,"rb")
}
resp = requests.post(url,headers=headers,files=files)
print(resp.request.headers)
return resp.json()
Content-Type
和Content-Length
标头是由请求库根据其文档在内部计算和添加的。在files
函数中分配给post
kwarg时,库知道它应该是一个multipart/form-data
请求。
请求标头的打印内容如下,显示了库添加的Content-Type
和Content-Length
。我省略了auth令牌。
{'User-Agent': 'python-requests/2.24.0','Accept-Encoding': 'gzip,deflate','Accept': '*/*','Connection': 'keep-alive','Authorization': 'Bearer <omitted>','Content-Length': '8201','Content-Type': 'multipart/form-data; boundary=bb582b9071574462d44c4b43ec4d7bf3'}
API的json响应是:
{'body': ['contentType must not be null'],'code': 400}
奇怪的是,当通过Postman发出相同的请求时,它会给出不同的响应-这也是我对Python的期望。
{ "code": 409,"body": "duplicate file name" }
这些是邮递员请求标头:
POST /s/wdata/prep/api/v1/file HTTP/1.1
Authorization: Bearer <omitted>
Accept: */*
Cache-Control: no-cache
Postman-Token: 34ed08d4-4467-4168-a4e4-c83b16ce9afb
Host: h.app.wdesk.com
Content-Type: multipart/form-data; boundary=--------------------------179907322036790253179546
Content-Length: 8279
在发送请求且用户未指定时,邮递员请求还会计算Content-Type
和Content-Length
标头。
对于为什么我从同一请求的API服务中得到两种不同的行为,我感到很困惑。 一定有我想念的东西,无法弄清楚它是什么。
解决方法
与NodeJS和Postman相比,找出我的请求出了什么问题。
API错误消息中引用的contentType
是文件参数的内容类型,而不是http请求标头Content-Type
。
当我像这样更新我的文件参数时,上传开始正常工作
files = {
"tableId": (None,table_id),"file": (Path(filepath).name,open(filepath,"rb"),"text/csv",None)
}
我了解到Python的请求库不会自动将文件的mime类型添加到请求正文中。我们需要对此予以明确。
希望这对其他人也有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。