使用urlencode传递凭证时Python requests.post报400错误求助
解决requests.post登录时400 Bad Request问题
问题场景
使用urlencode处理登录凭证后,调用requests.post始终返回400 Bad Request,错误信息如下:
File "/usr/local/lib/python3.6/site-packages/requests/models.py", line 960, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 400 Client Error: Bad Request for url:"urlname"/auth/login?username=user&password=password
用户代码:
loginin["password"] = PASSWORD loginin = {"username": USER, "password":PASSWORD} logindata = urllib.parse.urlencode(loginin, safe='[_/+$') print(type(logindata), logindata) if debug: print(logindata) headers = {'content-type': 'application/json'} rlogin = requests.post(urllogin, params=logindata, headers=headers, verify=False) rlogin.raise_for_status() print("status_code:", rlogin.status_code) if rlogin.status_code == 200: resplogin = json.loads(rlogin.text) print("resplogin",resplogin)
错误原因拆解
- 请求数据位置错误:
params参数用于拼接URL查询参数,POST请求的登录凭证应放在请求体中,而非URL上,这会导致接口无法正确识别请求数据格式。 - 头部与数据格式冲突:设置了
content-type: application/json头部,但实际传递的是urlencode处理后的表单格式数据,格式不匹配引发400错误。 - 冗余代码:
loginin["password"] = PASSWORD无意义,下一行直接重新定义了loginin字典,覆盖了之前的操作。 - 不必要的
urlencode:requests库会自动处理表单或JSON数据的编码,无需手动调用urlencode。
修正方案
方案1:接口接受JSON格式(最常见)
直接将字典传给json参数,requests会自动完成序列化并设置正确的头部:
loginin = {"username": USER, "password": PASSWORD} # 无需手动设置content-type,requests会自动添加正确的头部 rlogin = requests.post(urllogin, json=loginin, verify=False) rlogin.raise_for_status() print("status_code:", rlogin.status_code) if rlogin.status_code == 200: resplogin = rlogin.json() # 直接用response.json()解析返回结果 print("resplogin", resplogin)
方案2:接口接受表单格式(application/x-www-form-urlencoded)
将字典传给data参数,requests会自动处理编码和头部:
loginin = {"username": USER, "password": PASSWORD} rlogin = requests.post(urllogin, data=loginin, verify=False) rlogin.raise_for_status() print("status_code:", rlogin.status_code) if rlogin.status_code == 200: resplogin = rlogin.json() print("resplogin", resplogin)
内容的提问来源于stack exchange,提问作者Ajita Sharma
相关产品推荐
相关产品推荐

