使用 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>

ActiveMerchant 规范无法连接到 API,而开发模式使用相同的凭据工作正常

使用 ngrok 创建隧道以连接到 MongoDB 本地数据库