【问题标题】:Translate this curl to Python request将此 curl 转换为 Python 请求
【发布时间】:2021-07-08 03:10:09
【问题描述】:

我希望有人可以帮助我将这个 curl 请求转换为使用 Python 请求库的语法。这个 API 应该为我提供一张门票清单。我不熟悉在 Python 中使用标头和 API 密钥发出请求,因此我将不胜感激。谢谢你。尝试使用基本 URI 时,我也收到了 403 状态代码。

curl 请求 - 更改敏感信息。

curl -X POST \
  --url 'https://api.myapi.io/v2/apps/mine/xxx123/data/ticket/search' \
  -H 'x-api-key: myapiKEY123'\
  -H 'Accept: application/json' \
  -H 'Content-type: application/json' \
  --data-raw '{
  "startDate": "2021-03-01",
  "endDate": "2021-04-12"
}'

目前的python代码

import json
import requests

API_KEY = "myapiKEY123"
client_ID = 'xxx123'
url = '/v2/apps/mine/' + client_ID + '/data/ticket/search'
params = dict(key=API_KEY, lang='en-es')

requestObject = requests.get(
    url, params=params, headers=headers)
print(requestObject.status_code, requestObject.reason)


当前错误信息:

requests.exceptions.MissingSchema: Invalid URL '/v2/apps/mine/xxx123/data/ticket/search': No schema supplied. Perhaps you meant http:///v2/apps/mine/xxx123/data/ticket/search?

【问题讨论】:

标签: python curl python-requests header translate


【解决方案1】:

要修复您的即时错误,您传递给 requests 函数的 url 不完整。你得到的消息显示url以/v2开头,而它需要有完整的url,即以https://开头。

对于您的标题问题,标题是键/值对的简单字典,大致如下:


headers = {"x-api-key": "myapiKEY123", }

从那里,您将它正确地传递给 requests.get 函数。

【讨论】:

  • 谢谢!我错过了第一个愚蠢的错误。修复我的标题后,我仍然收到 403 错误。你认为我的代码中还有什么不正确的地方吗?
  • 403 通常表示您的令牌不正确。我不知道这段代码在做什么:params = dict(key=API_KEY, lang='en-es') 但您可能不需要它,请参阅@dephekt 的回答
【解决方案2】:

您的 URL 上没有架构 (http/https),​​这也不是完整的 URL:

import requests

api_key = "myapiKEY123"
client_id = 'xxx123'
url = f'https://api.myapi.io/v2/apps/mine/{client_id}/data/ticket/search'

headers = {
    'x-api-key': api_key,
    'Accept': 'application/json',
    'Content-type': 'application/json',
}
data = {
    'startDate': '2021-03-01',
    'endDate': '2021-04-12',
}

response = requests.get(url, data=data, headers=headers, timeout=10)

response.raise_for_status()

然后将响应打印为 JSON(如果他们使用 JSON 响应,这很可能),如 response.json() 或文本 response.textresponse.raise_for_status() 将检查状态代码是否指示失败(例如 response code was a 400-599),并使用状态代码和错误引发异常。

您也没有以 curl 建议的格式传递 API 密钥,这是我在上面修复的。我还添加了超时,因为请注意,请求库默认没有超时,所以如果服务器行为不端,连接将永远阻塞,这是不好的。

我也怀疑您是否应该将开始和结束日期作为查询参数而不是作为请求正文中的数据传递,所以我也进行了更新。使用params 会产生如下所示的请求:

https://api.myapi.io/v2/apps/mine/{client_ID}/data/ticket/search?startDate=2021-03-01&endDate=2021-04-12

当 curl(以及我上面的示例)正在做的是将这些值作为 JSON 传递到 POST 请求正文中时。

requests.get() 将返回一个requests.Response 对象,因此将其分配给一个名为requestObject 的变量也有点荒谬。

查看以下文档:

这不是代码中的功能问题,而是by convention,函数和变量名称在 Python 中应为小写,并使用下划线分隔术语,而不是驼峰式。例如。 response_object 而不是 responseObject,api_key 而不是 API_KEY,以及 client_id 而不是 client_ID。同样,它不会使您的代码不起作用,这只是惯例。你可以忽略它,但我至少想指出它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2020-03-18
    • 2018-01-30
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多