

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 步骤 3：获取访问令牌并发出 API 请求
<a name="request"></a>

本示例将介绍设置访问令牌的步骤，然后向您展示如何发出基本的 API 请求。这将为您提供基础知识，以开始构建由 Amazon DCV API 支持的更高级的应用程序。

在本示例中，我们将通过使用 `DescribeSessions` API 来说明如何执行该操作。

**Example**  
首先，我们导入应用程序所需的模型。  
然后，我们声明客户端 ID 变量（`__CLIENT_ID`）、客户端密码变量（`__CLIENT_SECRET`）和 Broker URL 变量，包括端口号变量（`__PROTOCOL_HOST_PORT`）。  
接下来，我们创建一个名为 `build_client_credentials` 的函数以生成客户端凭证。要生成客户端凭证，您必须先串联客户端 ID 和客户端密码并用冒号（`client_ID:client_password`）分隔这些值，然后对整个字符串进行 Base64 编码。  

```
import swagger_client
import base64
import requests
import json
from swagger_client.models.describe_sessions_request_data import DescribeSessionsRequestData
from swagger_client.models.key_value_pair import KeyValuePair
from swagger_client.models.delete_session_request_data import DeleteSessionRequestData
from swagger_client.models.update_session_permissions_request_data import UpdateSessionPermissionsRequestData
from swagger_client.models.create_session_request_data import CreateSessionRequestData

__CLIENT_ID = '794b2dbb-bd82-4707-a2f7-f3d9899cb386'
__CLIENT_SECRET = 'MzcxNzJhN2UtYjEzNS00MjNjLTg2N2YtMjFlZmRlZWNjMDU1'
__PROTOCOL_HOST_PORT = 'https://<broker-hostname>:8443'

def build_client_credentials():
    client_credentials = '{client_id}:{client_secret}'.format(client_id=__CLIENT_ID, client_secret=__CLIENT_SECRET)
    return base64.b64encode(client_credentials.encode('utf-8')).decode('utf-8')
```
现在我们生成了客户端凭证，可以使用该凭证从 Broker 中请求访问令牌。为此，我们创建一个名为 `get_access_token` 的函数。您必须对 ` https://Broker_IP:8443/oauth2/token?grant_type=client_credentials` 调用 `POST` 并提供授权标头，其中包括 Basic 编码的客户端凭证和内容类型 `application/x-www-form-urlencoded`。  

```
def get_access_token():
    client_credentials = build_client_credentials()
    headers = {
        'Authorization': 'Basic {}'.format(client_credentials),
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    endpoint = __PROTOCOL_HOST_PORT + '/oauth2/token?grant_type=client_credentials'
    print('Calling', endpoint, 'using headers', headers)
    res = requests.post(endpoint, headers=headers, verify=True)
    if res.status_code != 200:
        print('Cannot get access token:', res.text)
        return None
    access_token = json.loads(res.text)['access_token']
    print('Access token is', access_token)
    return access_token
```
现在，我们创建实例化客户端 API 所需的函数。要实例化客户端 API，您必须指定客户端配置和用于请求的标头。`get_client_configuration` 函数创建一个配置对象，其中包括 Broker 的 IP 地址和端口以及 Broker 自签名证书的路径（您应该从 Broker 管理员处收到了该证书）。`set_request_headers` 函数创建一个请求标头对象，其中包括客户端凭证和访问令牌。  

```
def get_client_configuration():
    configuration = swagger_client.Configuration()
    configuration.host = __PROTOCOL_HOST_PORT
    configuration.verify_ssl = True
    # configuration.ssl_ca_cert = cert_file.pem
    return configuration

def set_request_headers(api_client):
    access_token = get_access_token()
    api_client.set_default_header(header_name='Authorization',
                                  header_value='Bearer {}'.format(access_token))

def get_sessions_api():
    api_instance = swagger_client.SessionsApi(swagger_client.ApiClient(get_client_configuration()))
    set_request_headers(api_instance.api_client)
    return api_instance
```
最后，我们创建一个调用 `DescribeSessions` API 的 main 方法。有关更多信息，请参阅 [DescribeSessions](DescribeSessions.md)。  

```
def describe_sessions(session_ids=None, next_token=None, tags=None, owner=None):
    filters = list()
    if tags:
        for tag in tags:
            filter_key_value_pair = KeyValuePair(key='tag:' + tag['Key'], value=tag['Value'])
            filters.append(filter_key_value_pair)
    if owner:
        filter_key_value_pair = KeyValuePair(key='owner', value=owner)
        filters.append(filter_key_value_pair)

    request = DescribeSessionsRequestData(session_ids=session_ids, filters=filters, next_token=next_token)
    print('Describe Sessions Request:', request)
    api_instance = get_sessions_api()
    api_response = api_instance.describe_sessions(body=request)
    print('Describe Sessions Response', api_response)
    
def main():
    describe_sessions(
        session_ids=['SessionId1895', 'SessionId1897'],
        owner='an owner 1890',
        tags=[{'Key': 'ram', 'Value': '4gb'}])
```