如何在Python中确定所需的REST Get请求格式
对RESTAPI完全陌生,仍在学习python,所以我为一个简单的问题道歉,我是一个noob。感谢您的帮助 我正在尝试使用GET请求从服务器中提取数据。他们的网站上提供了这样做的说明:我也阅读了他们的网站。它表示您必须使用如何在Python中确定所需的REST Get请求格式,python,rest,python-requests,swagger,Python,Rest,Python Requests,Swagger,对RESTAPI完全陌生,仍在学习python,所以我为一个简单的问题道歉,我是一个noob。感谢您的帮助 我正在尝试使用GET请求从服务器中提取数据。他们的网站上提供了这样做的说明:我也阅读了他们的网站。它表示您必须使用swagger\u客户端,但我很难让它正常工作。相反,我使用requests模块拼凑了一些代码,并且似乎使用OAuth2正确地获得了一个令牌 import os, string, time from requests.auth import HTTPBasicAuth from
swagger\u客户端
,但我很难让它正常工作。相反,我使用requests模块拼凑了一些代码,并且似乎使用OAuth2正确地获得了一个令牌
import os, string, time
from requests.auth import HTTPBasicAuth
from requests.structures import CaseInsensitiveDict
import base64
#credentials
client_id= "[client id goes here]"
client_secret = "[secret goes here]"
secret64 = base64.b64encode(bytes(client_id + ':' + client_secret, 'utf-8')).decode('utf-8')
#time and stream to pull data from
dtime = 1617821133
AyyekaChannel_text = '183534'
token_url = 'https://restapi.ayyeka.com/auth/token'
base_url = 'https://restapi.ayyeka.com '
auth = HTTPBasicAuth(client_id, client_secret)
client = BackendApplicationClient(client_id=client_id)
oauth = OAuth2Session(client=client)
token = oauth.fetch_token(token_url='https://restapi.ayyeka.com/auth/token', auth=auth)
access_token = token['access_token']
headers = {'Authorization': 'Bearer ' + access_token}
response = requests.get(url=base_url,headers=headers)
令牌
返回:
{'access_token': '[token string appears here]', 'token_type': 'JWT', 'expires_in': 3600,'expires_at': 1617909733.2390773}
现在我陷入困境,不知道如何通过GET来获取身份验证令牌,也不知道如何使用REST命令来提取数据。我在正确的轨道上吗?完全错了
response
只返回一系列错误,但我知道它无论如何都不对,但我无法确定下一步,因为他们的文档使用了swagger\u客户端
。我不确定我是否应该回去尝试让“招摇过市”客户端工作,或者这是否应该工作?很难给出一个好的例子,因为我无法访问他们的帮助文档。这就是说,看起来您正在获得一个JWT令牌,并且您正在传递一个带有该令牌的头。我很想知道你在回复中到底犯了什么错误。您可以使用response.status\u代码和response.text检查这一点
您的base\u url变量base\u url='1'中有一个空格https://restapi.ayyeka.com “
而不是base\u url=”https://restapi.ayyeka.com“
。这可能是你问题的一部分。您也没有附加任何实际的API端点。此外,他们的文档在curl示例中显示,应该在该URL后面附加一个版本(请参见下面的mybase\uURL
)
正如barny所说,您可能希望在这里使用requests.Session()。您在评论中询问了如何做到这一点,下面是如何做到的:
dtime = 1617821133
AyyekaChannel_text = "183534"
base_url = "https://restapi.ayyeka.com/v2.0"
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {access_token}"})
params = {
"sampleID": AyyekaChannel_text,
"backfillHours": dtime,
}
session.get(url=f"{base_url}/sample/batch", params=params)
尽管如此,文档中还是提到了关于backfillHours
:
指定从数小时前开始发送样本。例如,如果backfillHours值为24,则这是提供过去24小时的所有样本的请求
我不知道您对dtime
的预期用途是什么,但显然1617821133
就像过去的180000多年一样,但我在这里使用它作为一个示例,说明您如何将该值作为查询参数传递到请求中,假设它是一个正常值
您可能还需要使用面向对象的方法来实现整个过程。以下是一个非常简短的示例,用于说明:
class AyyekaClient:
"""A client implementing the Ayyeka API."""
def __init__(self, client_id: str, client_secret: str):
self.base_url = "https://restapi.ayyeka.com/v2.0"
self.client_id = client_id
self.client_secret = client_secret
self.auth = HTTPBasicAuth(client_id, client_secret)
self.client = BackendApplicationClient(client_id=self.client_id)
self.oauth = OAuth2Session(client=self.client)
self.session = requests.Session()
self.session.hooks["response"] = [self.raise_for_status]
self.refresh_access_token()
def raise_for_status(response, *args, **kwargs):
"""Requests event hook to call raise_for_status on every request."""
response.raise_for_status()
def refresh_access_token(self):
"""Get a fresh access token."""
token = self.oauth.fetch_token(token_url="https://restapi.ayyeka.com/auth/token", auth=self.auth)["access_token"]
self.session.headers.update({"Authorization": f"Bearer {token}"})
def get_sample_scalar_batch(self, sample_id: str, backfill_hours: int) -> requests.Response:
"""Get a Batch of New SamplesScalar."""
params = {"sampleID": sample_id, "backfillHours": backfill_hours}
return self.session.get(url=f"{self.base_url}/sample/batch", params=params)
然后实现该类,如下所示:
ayyeka = AyyekaClient(client_id="123456", client_secret="78910112")
response = ayyeka.get_sample_scalar_batch(sample_id, backfill_hours)
print(response.text)
print(response.json())
这些JWT令牌只有1小时的生命周期,因此您偶尔需要调用ayyeka.refresh\u access\u token()
,或者执行某种错误处理,如果由于401/403错误导致请求失败,则刷新令牌并重试请求。该方法将自动获取一个新令牌,并更新会话的授权头以利用该令牌
这只是一个说明性的例子,说明如何在这里使用类。我没有花太多的心思在这上面。您可以将其余的API端点实现为此类上的方法,然后在单独的脚本/模块中实现客户端。使用请求会话确保每个GET/PUT/post上都可以访问cookie。感谢您的帮助!你介意详细说明一下吗?虽然我熟悉python,但对于类似的事情,我是一个完全的新手。我觉得自己像个傻瓜,但只是在努力学习!哇,太多细节了!我将认真考虑你的所有建议。非常感谢您的时间和努力!谢谢@RossV-如果您有时间,请将其标记为已接受的答案,好吗?谢谢