使用CommonRequest进行调用

更新时间:

使用 CommonRequest 进行调用介绍。

说明

当您要调用的某个产品的 API 没有提供 SDK 时,可以采用泛用型的 API 调用方式(CommonRequest)。使用 CommonRequest 调用方式可实现任意 OpenAPI 接口的调用。

CommonRequest 调用特点

CommonRequest 的特点如下:

  1. 轻量:只需 Core 包即可发起调用,无需下载安装各产品的 SDK。

  2. 简便:无需更新 SDK 即可调用最新发布的 API。

  3. 快速迭代。

使用 CommonRequest

阿里云产品的 API 有 RPC 和 RESTful 两种风格,不同风格的 API 的 CommonRequest 的调用方法也不同。

通常 API 参数中包含 Action 参数的是RPC风格,包含 PathPattern 参数的是 RESTful 风格。一般情况下,每个产品内,所有 API 的调用风格是统一的。每个 API 仅支持特定的一种风格调用,传入错误的标识,可能会调用到其他 API,或收到ApiNotFound的错误信息。

发起一次 CommonRequest 请求,您需要获取以下几个参数的值。您可以在文档中心各产品的API文档中获取以下参数的值。此外,部分产品也可以通过OpenAPI 开发者门户来获取API的参数信息。

  • 域名(domain):该产品的服务地址。

  • API版本(version):该API的版本号,格式为 YYYY-MM-DD。

  • 接口信息:要调用的接口名称。

    • 当调用的 API 为 RPC 风格(大部分阿里云产品 API 为 RPC 风格,如 ECS 和 RDS)时,需要获取 Action 参数,使用request.ApiName = "<Action>"的方式来指定 API 名称。

      • 例如 RunInstances 接口,在发起 CommonRequest 请求时,需要使用request.ApiName = "RunInstances"来指定 API 名称。

    • 当调用的 API 为 RESTful 风格(如容器服务)时,需要获取 PathPattern 参数,使用request.PathPattern = "<PathPattern>"的方式来指定 RESTful 路径。

      • 例如容器服务的查看所有集群实例的 API 的 PathPattern 为/clusters,在发起 CommonRequest 请求时,要使用request.PathPattern = "/clusters"指定 RESTful 路径。

示例:调用RPC风格的API

以下代码展示了如何使用 CommonRequest 的方式调用 CDN 的 DescribeCdnService 接口:

<?php
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
try {
    $result = AlibabaCloud::rpc()
                          ->product('Cdn')
                          ->version('2014-11-11')
                          ->action('DescribeCdnService')
                          ->method('POST')
                          ->request();
    print_r($result->toArray());
} catch (ClientException $exception) {
    print_r($exception->getErrorMessage());
} catch (ServerException $exception) {
    print_r($exception->getErrorMessage());
}

示例:调用 RESTful(ROA)风格的 API

以下代码展示了如何使用 CommonRequest 的方式调用容器服务的 DescribeClusterServices 接口:

<?php
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
try {
    $result = AlibabaCloud::roa()
                          ->regionId('cn-hangzhou') // 指定请求的地域,不指定则使用客户端地域、默认地域。
                          ->product('CS') // 指定产品。
                          ->version('2015-12-15') // 指定产品版本。
                          ->action('DescribeClusterServices') // 指定产品接口。
                          ->serviceCode('cs') // 设置 ServiceCode 以备寻址,非必须。
                          ->endpointType('openAPI') // 设置类型,非必须。
                          ->method('GET') // 指定请求方式。
                          ->host('cs.aliyun.com') // 指定域名则不会寻址,如认证方式为 Bearer Token 的服务则需要指定。
                          ->pathPattern('/clusters/[ClusterId]/services') // 指定 ROA 风格路径规则。
                          ->withClusterId('123456') // 为路径中参数赋值,方法名:with + 参数。
                          ->request(); // 发起请求并返回结果对象,请求需要放在设置的最后面。
    print_r($result->toArray());
} catch (ClientException $exception) {
    print_r($exception->getErrorMessage());
} catch (ServerException $exception) {
    print_r($exception->getErrorMessage());
}