Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中确定所需的REST Get请求格式_Python_Rest_Python Requests_Swagger - Fatal编程技术网

如何在Python中确定所需的REST 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

对RESTAPI完全陌生,仍在学习python,所以我为一个简单的问题道歉,我是一个noob。感谢您的帮助

我正在尝试使用GET请求从服务器中提取数据。他们的网站上提供了这样做的说明:我也阅读了他们的网站。它表示您必须使用
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后面附加一个版本(请参见下面的my
base\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-如果您有时间,请将其标记为已接受的答案,好吗?谢谢