Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python请求删除“;“数据”;当使用;标题“;请求_Python_Rest_Post_Python Requests - Fatal编程技术网

python请求删除“;“数据”;当使用;标题“;请求

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',

我正在使用一个站点的REST API,当我想要上载文件时,该站点需要此请求类型:

  • 标题中的“授权”和多部分内容类型
  • 文件格式为二进制字符串(正文)
  • 请求URL中的文件类型
  • 所以我做了以下代码:

    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"
    }