python请求删除“;“数据”;当使用;标题“;请求
我正在使用一个站点的REST API,当我想要上载文件时,该站点需要此请求类型:python请求删除“;“数据”;当使用;标题“;请求,python,rest,post,python-requests,Python,Rest,Post,Python Requests,我正在使用一个站点的REST API,当我想要上载文件时,该站点需要此请求类型: 标题中的“授权”和多部分内容类型 文件格式为二进制字符串(正文) 请求URL中的文件类型 所以我做了以下代码: import requests url = 'http://httpbin.org/post' parameters = { 'format': 'pdf', } headers = { 'Content-Type': 'multipart/form-data',
import requests
url = 'http://httpbin.org/post'
parameters = {
'format': 'pdf',
}
headers = {
'Content-Type': 'multipart/form-data',
'Accept': 'application/json',
'Authorization' : 'Some authorization code'
}
data = {'file': open('1.pdf', 'rb')}
r = requests.post(url, params=parameters, headers=headers, data=data)
print(r.text)
但似乎请求正在丢弃数据:
{
"args": {
"format": "pdf"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Authorization": "Some authorization code",
"Connection": "close",
"Content-Length": "30",
"Content-Type": "multipart/form-data",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.1"
},
"json": null,
"origin": "x.x.x.x",
"url": "http://httpbin.org/post?format=pdf"
}
当我删除请求中的“标题”部分时,它会起作用:
r = requests.post(url, params=parameters, data=data)
因为答案是:
{
"args": {
"format": "pdf"
},
"data": "",
"files": {},
"form": {
"fax_file": "some samplae texts\n"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "30",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.1"
},
"json": null,
"origin": "x.x.x.x",
"url": "http://httpbin.org/post?format=pdf"
}
我也试过准备好的请求,结果是一样的 您正试图发布文件数据,因此请使用
文件
选项:
r = requests.post(url, params=parameters, files=data, headers=headers)
但是,您确实不应该设置内容类型
标题;当您使用文件
选项时,它会为您设置。本例中的标题包含字段边界,以便真正希望库为您解决此问题:
headers = {
'Accept': 'application/json',
'Authorization' : 'Some authorization code'
}
如果保留内容类型标题,则必须提前生成内容主体,以便能够向接收服务器提供所需的边界信息
您也可以尝试删除Accept
标题;默认情况下,请求
将添加接受:*/*
,如果您未指定该标头,则表示任何内容都可以接受
仅使用数据
参数时,参数编码为应用程序/x-www-form-urlencoded
表单,该表单不支持大文件数据,并且您的内容类型
标题与实际的文章正文内容不匹配
请参阅请求
文档和此处的堆栈溢出
演示:
导入请求
>>>url='1〕http://httpbin.org/post'
>>>参数={'format':'pdf'}
>>>标题={
…'Accept':'application/json',
…'授权':'某些授权代码',
... }
>>>数据={'file':打开('1.pdf','rb')}
>>>r=requests.post(url,params=parameters,files=data,headers=headers)
>>>打印(右文本)
{
“args”:{
“格式”:“pdf”
},
“数据”:“,
“文件”:{
“文件”:”
},
“形式”:{},
“标题”:{
“接受”:“应用程序/json”,
“接受编码”:“gzip,deflate”,
“授权”:“某些授权代码”,
“缓存控制”:“最大年龄=0”,
“连接”:“关闭”,
“内容长度”:“374751”,
“内容类型”:“多部分/表单数据;边界=d4b84f8bfd464e3f97e3de584d7315fc”,
“主机”:“httpbin.org”,
“O2Gw Id”:“03”,
“用户代理”:“python请求/2.18.4”,
“X-Gateway”:“wap.london.02.net”
},
“json”:null,
“来源”:“10.120.6.78、82.132.221.209”,
“url”:”http://httpbin.org/post?format=pdf"
}
注意
多部分/表单数据;boundary=d4b84f8bfd464e3f97e3de584d7315fc
内容类型标题的值 如果您在数据中传递读取文件而不是文件对象的字节,会发生什么情况?@match仍然会删除,直到我从标题中删除“content type”谢谢,真的很有帮助
>>> import requests
>>> url = 'http://httpbin.org/post'
>>> parameters = {'format': 'pdf'}
>>> headers = {
... 'Accept': 'application/json',
... 'Authorization' : 'Some authorization code',
... }
>>> data = {'file': open('1.pdf', 'rb')}
>>> r = requests.post(url, params=parameters, files=data, headers=headers)
>>> print(r.text)
{
"args": {
"format": "pdf"
},
"data": "",
"files": {
"file": "<file data as base64>"
},
"form": {},
"headers": {
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Authorization": "Some authorization code",
"Cache-Control": "max-age=0",
"Connection": "close",
"Content-Length": "374751",
"Content-Type": "multipart/form-data; boundary=d4b84f8bfd464e3f97e3de584d7315fc",
"Host": "httpbin.org",
"O2Gw-Id": "03",
"User-Agent": "python-requests/2.18.4",
"X-Gateway": "wap.london.02.net"
},
"json": null,
"origin": "10.120.6.78, 82.132.221.209",
"url": "http://httpbin.org/post?format=pdf"
}