将CURL请求转为Python请求后返回400错误,求技术解决
问题排查与修正
你的Python代码存在两个核心问题,导致返回400错误:
Basic Auth未做Base64编码
原curl命令中,$basic_auth是通过echo -n $client_id:$client_secret | base64生成的Base64编码字符串,但你的代码直接将client_id:client_secret明文放到了请求头里,不符合认证要求。请求数据格式错误
curl的-d参数是发送**表单格式(application/x-www-form-urlencoded)**的数据,而你用了json=data,会把数据以JSON格式发送,API服务端无法解析。
修正后的代码
import requests import base64 client_id = 'XXX' client_secret = 'YYYYYYYYYYYYYY' token_url = 'https://tokenurl.com' # 对client_id:client_secret进行Base64编码 basic_auth_str = f"{client_id}:{client_secret}" basic_auth = base64.b64encode(basic_auth_str.encode('utf-8')).decode('utf-8') headers = {'Authorization': f"Basic {basic_auth}"} # 使用data参数发送表单格式数据,而非json参数 data = {'client_id': client_id, 'grant_type': 'client_credentials'} response = requests.post(token_url, headers=headers, data=data) # 可打印响应内容进一步排查问题 print(response.status_code) print(response.text)
另外,也可以直接使用requests库自带的HTTPBasicAuth简化认证流程,效果完全一致:
import requests client_id = 'XXX' client_secret = 'YYYYYYYYYYYYYY' token_url = 'https://tokenurl.com' data = {'client_id': client_id, 'grant_type': 'client_credentials'} # 用auth参数自动处理Basic Auth的编码逻辑 response = requests.post(token_url, auth=(client_id, client_secret), data=data) print(response.status_code) print(response.text)
内容的提问来源于stack exchange,提问作者JunkLatte
相关产品推荐
相关产品推荐

