使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为啥?

Posted

技术标签:

【中文标题】使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为啥?【英文标题】:Strava GPX upload with python module requests is giving a ValueError - why?使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为什么? 【发布时间】:2021-12-21 05:28:10 【问题描述】:

我不明白为什么会出现这个 ValueError?

发布请求
import requests

headers = 'authorization': 'Bearer XXXXXXXXXXXXXXXX'
files = ['file': open('../poc_data/Sport-sessions/GPS-data/2012-08-09_05-32-43-UTC_55d566fa93bc7d9d1757b8e0.gpx', 'rb'), 'data_type': 'gpx', 'Content-Type': 'multipart/form-data']

r = requests.post('https://www.strava.com/api/v3/uploads', headers=headers, files=files)

错误回溯

*Traceback(最近一次通话最后一次): 中的文件“D:/projekte/11_github/poc_runtastic/poc_code/strava_upload_activities.py”,第 19 行 r = requests.post('https://www.strava.com/api/v3/uploads', headers=headers, files=files) 文件“E:\Python\Python38\lib\site-packages\requests\api.py”,第 117 行,在 post 返回请求('post', url, data=data, json=json, **kwargs) 文件“E:\Python\Python38\lib\site-packages\requests\api.py”,第 61 行,在请求中 返回 session.request(method=method, url=url, *kwargs) 文件“E:\Python\Python38\lib\site-packages\requests\sessions.py”,第 528 行,在请求中 prep = self.prepare_request(req) 文件“E:\Python\Python38\lib\site-packages\requests\sessions.py”,第 456 行,在 prepare_request p.prepare( 文件“E:\Python\Python38\lib\site-packages\requests\models.py”,第 319 行,在准备中 self.prepare_body(数据、文件、json) 文件“E:\Python\Python38\lib\site-packages\requests\models.py”,第 512 行,在 prepare_body (body, content_type) = self._encode_files(files, data) 文件“E:\Python\Python38\lib\site-packages\requests\models.py”,第 141 行,在 _encode_files 文件中的 (k, v):

ValueError:没有足够的值来解包(预期 2,得到 1)

【问题讨论】:

【参考方案1】:

这种效果的原因与 API 设计有关:它需要一个名为 headers 的显式字典和一个名为 params 的字典。 在上面给出的示例中,我只发送了一个(标题),这解释了 ValueError。

此代码有效:

import requests


files = 
    'file': open('../poc_data/Sport-sessions/GPS-data/2012-08-09_05-32-43-UTC_55d566fa93bc7d9d1757b8e0.gpx', 'rb')

headers = 
    'authorization': 'Bearer XXXXXXXXXXXXXXXX'

params = 
    'data_type': 'gpx'

url = 'https://www.strava.com/api/v3/uploads'


r = requests.post(files=files, headers=headers, params=params, url=url)

【讨论】:

以上是关于使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌

使用 Strava 提供程序进行 Firebase 身份验证

python 的http请求模块 urllib3

Strava - 具有纬度、经度和时间的团体路线接近度

Python接口自动化之浅析requests模块get请求

Python接口自动化之浅析requests模块get请求