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();