Python调用REST API:获取认证token后作为变量调用POST请求鉴权失败
问题原因及解决方法
核心错误原因
你在构造authenticationtoken变量时,主动在token首尾拼接了多余的单引号:
authenticationtoken = "'" + 处理后的token内容 + "'"
这会导致变量实际存储的内容是'你的实际token值'(字符串本身携带单引号),而你手动复制打印结果赋值时:
a = 'myauthenticationtokenabc/123'
这里的单引号是Python的字符串边界标识,变量a里实际存储的内容是没有单引号的myauthenticationtokenabc/123,和你自动生成的带单引号的变量内容完全不一样,接口校验ticket的时候自然会报错。
修复方案
- 去掉拼接的单引号,同时不要手动处理JSON返回值,用requests自带的JSON解析方法更稳妥,避免后续接口返回格式变化导致解析错误,同时修正你第一个请求的示例代码笔误:
import requests # 授权接口请求 auth_url = '你的授权接口地址' # payload建议用字典格式更规范,不需要手动拼接字符串 payload = {'username':'你的账号', 'password':'你的密码'} auth_headers = {'你的请求头key':'对应的value'} response = requests.post(auth_url, headers=auth_headers, data=payload) # 直接解析JSON获取ticket,不需要手动做替换操作,response.json()会自动处理转义字符 authenticationtoken = response.json()['ticket'] # 如果返回的ticket确实存在多余反斜杠,再额外加一步替换:authenticationtoken = authenticationtoken.replace('\\', '')
- 第二个上传请求直接使用上面解析好的变量即可,同时修正代码里的笔误:
files = {'file': open(r"你的文件路径", "rb")} data = { 'type':你的类型参数值, 'parent_id': 你的父ID参数值, 'name': 'DummyFile' } upload_url = "你的上传接口地址" upload_headers = {'ticket': authenticationtoken } response = requests.post(upload_url, headers=upload_headers, files=files, data=data) print(response.text) # 原代码里的cs是未定义变量,改为response
额外优化建议
- 打开文件上传完成后建议主动关闭文件,或者用
with open(文件路径, 'rb') as f的上下文管理器写法,避免资源占用。 - 可以给授权请求加异常捕获,避免接口调用失败时后续解析JSON报错。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

