POST 请求文件 python-requests

xda*_*iel 3 python post request python-requests postman

这是我在python中需要的post请求的目标:

我得到了 XML 文件、url 和身份验证令牌。根据 xml 文件,我从服务器返回 xml 响应。

req = requests.post(url='http://abc123.com/index.php/plan/', \     
            headers={'auth-token': 'abCdeFgh'}, \
            data={'data': open('sample_plan.xml', 'rb')})
Run Code Online (Sandbox Code Playgroud)

Post 请求状态码为 200,但 xml 响应中有错误,如“ <error>invalid XML for request</error>”。据说在我的 post 请求中 xml 文件填写了错误的参数。但是在另一个工具中 - Postman - https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en?它以正确的 xml 响应工作并成功。我在邮递员中有什么:

  • 在标题中: :身份验证令牌:abCdeFgh

  • 在正文中:选择了表单数据选项。 :数据:选择了sample_plan.xml 文件。

post 请求的参数目标(所有参数都是必需的): 1. 在标头中 - Authentication-Token 2. 在正文中 - 名称/内容 ID = 数据的 XML 文件

我应该将post请求的文件放入哪个参数?我已经尝试了几乎所有的东西——基于 python-requests 文档......

谢谢你的帮助!

xda*_*iel 5

经过几个小时的尝试,我得到了它!

正确的参数是文件,并且必须有带有 3 个参数的元组值的“数据”键。否则它无法正常工作......

从请求文档中,我使用文件参数进行多部分编码上传http://docs.python-requests.org/en/master/api/“数据”,我被 + 3 元组的值(“文件名” , 文件对象, 'content_type')

因此,我的问题的答案是(也使用 'with' 关键字,以便在套件完成后正确关闭文件)

with open('sample_plan.xml', 'rb') as payload:
    headers = {'auth-token': 'abCdeFgh'}
    files = {'data': ('sample_plan.xml', payload, 'text/xml')}
    req = requests.post(url='http://abc123.com/index.php/plan/', \
            headers=headers, files=files)
Run Code Online (Sandbox Code Playgroud)