Python requests调用REST API传凭证报401认证失败如何解决
问题根因
报错是Python字符串转义规则破坏了域账号格式的用户名导致的。
代码中写的用户名'cormama.remote\jamal'里,\是Python默认的字符串转义起始符,虽然\j不属于Python内置的标准转义序列,但requests库构造Basic认证请求头、对用户名做Base64编码时,这个未正确转义的反斜杠会被错误解析,最终发给服务端的用户名不是预期的cormama.remote\jamal,服务端校验凭证不通过就返回401。
DOS下curl调用能正常访问,是因为cmd环境下用双引号包裹参数时,反斜杠不会被默认转义,传给服务端的账号名完整正确,所以认证成功。
修复方案
按顺序操作即可:
- 给用户名字符串加
r前缀,声明为Python原生字符串,强制Python不解析字符串内的转义序列,完整保留反斜杠字符。 - 显式导入
HTTPBasicAuth类指定认证方式,避免requests自动探测认证类型时出现匹配偏差。 - 若仍报错,手动添加
Accept: application/json请求头,匹配API的格式校验要求。
修正后的完整代码:
import requests as re from requests.auth import HTTPBasicAuth re.packages.urllib3.disable_warnings() url = 'https://nwsppl300p:9090/nwrestapi/v3/global/clients/?q=hostname:BMCJCA001T.corpads.local' auth = HTTPBasicAuth(r'cormama.remote\jamal', 'Inventigation100get$pump') headers = {"Accept": "application/json"} r = re.get(url, auth=auth, verify=False, headers=headers) print(r.content)
注意:密码里的
$符号在Python单引号包裹的普通字符串中不会被转义,不需要额外修改,只要正确处理用户名的反斜杠就能解决绝大多数同类报错。
内容的提问来源于stack exchange,提问作者postmaster 420
相关产品推荐
相关产品推荐

