使用 Shell 连接到 API 工作,但带有 Python 请求库会抛出 400 Client Error: Bad Request for url
Posted
技术标签:
【中文标题】使用 Shell 连接到 API 工作,但带有 Python 请求库会抛出 400 Client Error: Bad Request for url【英文标题】:Connecting to API works using Shell but w/ Python requests lib throws 400 Client Error: Bad Request for url 【发布时间】:2021-04-28 10:32:17 【问题描述】:我正在尝试使用我的访问令牌连接到 Fluctuo(移动数据)GraphQL API。它使用 curl Shell 脚本运行良好,但在尝试使用 Python requests 库时会抛出 400 Client Error: Bad Request for url
。
这是有效的 curl 脚本:
curl --request POST \
--url https://flow-api.fluctuo.com/v1?access_token=MY_ACCESS_TOKEN \
--header 'content-type: application/json' \
--data '"query":"query ($lat: Float!, $lng: Float!) \n vehicles(lat: $lat, lng: $lng) \n\t\tid\n \n","variables":"lat":48.856614,"lng":2.352222'
这是引发错误的 Python 代码:
url = "https://flow-api.fluctuo.com/v1?access_token=" + MY_ACCESS_TOKEN
head = 'content-type': 'application/json'
query='''
query ($lat: Float!, $lng: Float!) \n vehicles(lat: $lat, lng: $lng) \n\t\tid\n \n","variables":"lat":48.856614,"lng":2.352222'''
try:
r = requests.post(url, json='query': query,headers=head)
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
非常感谢任何关于可能出错的想法。
【问题讨论】:
【参考方案1】:与此同时,我找到了解决方案:POST 数据需要进行 JSON 编码。我将查询转储到 JSON 中,这解决了这个问题。请参阅下面的代码。
import requests
import json
url = "https://flow-api.fluctuo.com/v1?access_token=" + MY_ACCESS_TOKEN
head = 'content-type': 'application/json'
data = "query":"query ($lat: Float!, $lng: Float!) \n vehicles(lat: $lat, lng: $lng) \n\t\tid\n \n","variables":"lat":48.856614,"lng":2.352222
try:
r = requests.post(url, data=json.dumps(data), headers=head)
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
r.status_code
【讨论】:
以上是关于使用 Shell 连接到 API 工作,但带有 Python 请求库会抛出 400 Client Error: Bad Request for url的主要内容,如果未能解决你的问题,请参考以下文章
Nginx 部署 Angular 前端未连接到 DRF 后端
Angular - 连接到代理服务器并获得响应,但随后在其他时间有效的 api 调用上显示错误
AWS Elastic Beanstalk Worker 无法连接到 SQS
Spring Boot:API 访问出错:无法连接到 <domainName>