关于阿里云Rds接口调用的记录

最近在使用阿里云open_Api的Rds实现database的创建和对创建的database的授权,在使用过程中存在一些使用的问题,在此记录一下。


注:这里使用的语言是php

阿里云提供的rds接口在此粘贴:

    请求示例:
    https://rds.aliyuncs.com/?Action=CreateDatabase
&CharacterSetName=gbk
&DBName=testdb02
&DBInstanceId=riauvjz6zajfiq6ba1370329449201
&<[公共请求参数]>

    返回示例:
    XML格式:
    <CreateDatabaseResponse>
         <RequestId>5A77D650-27A1-4E08-AD9E-59008EDB6927</RequestId>
    </CreateDatabaseResponse>

    JSON格式:
  {
    "RequestID":"5A77D650-27A1-4E08-AD9E-59008EDB6927"
  }

官方文档请看这里

官方文档的接口实现是发送请求,获取响应,而sdk是对这个过程进行了封装,简单的请求类的实例化,发送请求就完成了创建database和授权的过程。

实例代码如下:


    这是aliyun SDK中通用客户端类
    $c = new AliyunClient;
    $c->accessKeyId = $this->accessKeyId;
    $c->accessKeySecret = $this->accessKeySecret;
    $c->serverUrl=$this->serverUrl;//根据不同产品选择相应域名,例如:RDS  http://rds.aliyuncs.com/

    下面创建 database请求实例
    $request = new Rds20140815CreateDatabaseRequest();
    $request->setCharacterSetName('utf8');
    $request->setdBInstanceId($this->dbInstanceId);
    $request->setdBName($this->completeDatabase);
    $request->check();
    $create = $c->execute($request);//这是执行发送请求的过程

    再贴一个授权的实例:
    $grantRequest = new Rds20140815GrantAccountPrivilegeRequest();
    $grantRequest->setdBName($this->completeDatabase);
    $grantRequest->setdBInstanceId($this->dbInstanceId);
    $grantRequest->setAccountName($this->accountName);
    $grantRequest->setAccountPrivilege('ReadWrite');
    $grantRequest->check();
    $res = $c->execute($grantRequest);

这里正常情况下就是 建库成功 授权成功,但是在实现的过程中出现了问题:
建库成功以后,授权不成功,所以无法操作database,纠结一段时间终于发现了,建库完成后,阿里是返回了一个RequestId,但是这并不代表建库完成,它只是告诉你可以建库并且正在执行,如果拿到requestId就去执行授权,或者操作,就会失败,所以在这个地方要注意:

建库和授权的过程以及其他过程,是需要耗时的。建库和授权,还有很多操作之间都存在时间差。

所以,建库完成后,让程序sleep,直到它完成这个过程

什么时候才算这个过程完成,阿里云提供了查询database状态的接口,通过这个 接口可以查询要操作的database的状态,阿里数据库提供了三种:creating,running,deleting,上代码:(方法是自己定义的,前面4句是接口调用的)

 //获取阿里云数据库状态
    protected function DatabaseStatus($c)
    {
        $describeRequest = new Rds20140815DescribeDatabasesRequest();
        $describeRequest->setdBInstanceId($this->dbInstanceId);
        $describeRequest->check();
        $status = $c->execute($describeRequest);
        $status_temp= "";
        foreach ($status->Databases->Database as $v) {
            if($v->DBName==$this->completeDatabase){
                if($v->DBStatus=="Running"){
                    $status_temp = "Running";
                }
                break;
            }else{
                continue;
            }
        }
        return $status_temp;
    }

关于两个过程中间的时间差,php 可以 执行 sleep();
使用递归直到过程执行完成,这个自行完成就可以了。

这是在写代码过程中的一点记录,有用拿走,无用轻喷。

标签