SDK 客户端的初始化和请求方式
本节主要是介绍客户端的 Client 初始化方式以及如何发起 OpenAPI 请求。
SDK 客户端初始化
原版 SDK 因为是所有产品的 SDK 共用一个 SDK Core,所以通过这个共用 SDK Core 中的方法初始化生成一个 client 对象来处理所有产品的请求,下面是原版 SDK 初始化的示例:
<?php
use AlibabaCloud\Client\AlibabaCloud;
// 创建一个客户端并链式调用设置其它选项
AlibabaCloud::accessKeyClient('accessKeyId', 'accessKeySecret')
->regionId('cn-hangzhou') // 设置客户端区域,使用该客户端且没有单独设置的请求都使用此设置
->timeout(1) // 超时1秒,使用该客户端且没有单独设置的请求都使用此设置
->connectTimeout(0.1) // 连接超时10毫秒,当单位小于1,则自动转换为毫秒,使用该客户端且没有单独设置的请求都使用此设置
->debug(true) // 开启调试,CLI下会输出详细信息,使用该客户端且没有单独设置的请求都使用此设置
->name('client1');
// 设置默认区域,当某个请求和请求的客户端没有设置区域,则使用默认区域
AlibabaCloud::setDefaultRegionId('cn-hangzhou');
// 获取默认区域
AlibabaCloud::getDefaultRegionId();
// 获取所有客户端
AlibabaCloud::all();
// 获取指定客户端,不存在则抛出异常
AlibabaCloud::get('client1');
// 获取指定客户端的 Access Key
AlibabaCloud::get('client1')->getCredential()->getAccessKeyId();
// 给指定客户端起一个新名字
AlibabaCloud::get('client1')->name('otherName');
// 获取默认客户端的区域,等等
AlibabaCloud::getDefaultClient()->regionId;
// 判断指定名称客户端是否存在
AlibabaCloud::has('client1');
// 删除一个客户端
AlibabaCloud::del('client1');
// 清除所有客户端配置
AlibabaCloud::flush();
// 根据默认配置文件创建客户端,文件不存在跳过,文件解析错误抛出异常
AlibabaCloud::load();
// 指定配置文件创建客户端,文件不存或解析错误将抛出异常
AlibabaCloud::load('your/path/file', 'vfs://AlibabaCloud/credentials', '...');
// 获取某种客户端的 AccessKey 或 STS 访问凭据,若该客户端本属于该凭据则直接返回
AlibabaCloud::ecsRamRoleClient('role')->getSessionCredential();
// 获取指定客户端的 AccessKey 或 STS 访问凭据,若该客户端本属于该凭据则直接返回
AlibabaCloud::get('client1')->getSessionCredential();
说明
单 Client 的模式存在线程不安全的问题,而且通过一个 profile 信息在不同产品之间混用造成的权限管理问题
OpenAPI 请求方式
原版 SDK 通过 SDK Core 进行 OpenAPI 的请求,开发者通过 SDK 的 Request 和 Response 对象来指定请求的 OpenAPI,请求 OpenAPI 的示例如下:
$result = AlibabaCloud::rpc([
'debug' => true,
'timeout' => 0.01,
'connect_timeout' => 0.01,
'query' => [
'Product' => 'Ecs',
'Version' => '2014-05-26',
'Action' => 'DescribeRegions',
],
])->options([
// 所有参数也可以在 options 方法中设置或重新设置
'query' => [
'Param1Name' => 'Param1Value',
'Param2Name' => 'Param2Value',
],
])
->options([
// 可以多次调用 options 方法
'query' => [
'Param1Name' => '会覆盖之前的值',
'Param2Name' => '会覆盖之前的值',
'Action' => '会覆盖 DescribeRegions',
'New' => '是新增的值',
],
])
->debug(false) // 最后调用的会覆盖前者的 true
->timeout(0.02) // 最后调用的会覆盖前者的 0.01
->request();