关于阿里云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();
使用递归直到过程执行完成,这个自行完成就可以了。
这是在写代码过程中的一点记录,有用拿走,无用轻喷。