You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
3.9 KiB
175 lines
3.9 KiB
<?php
|
|
|
|
namespace OSS\Result;
|
|
|
|
use OSS\Core\OssException;
|
|
use OSS\Http\ResponseCore;
|
|
|
|
|
|
/**
|
|
* Class Result, 操作结果类的基类,不同的请求在处理返回数据的时候有不同的逻辑,
|
|
* 具体的解析逻辑推迟到子类实现
|
|
*
|
|
* @package OSS\Model
|
|
*/
|
|
abstract class Result
|
|
{
|
|
/**
|
|
* Result constructor.
|
|
* @param $response ResponseCore
|
|
* @throws OssException
|
|
*/
|
|
public function __construct($response)
|
|
{
|
|
if ($response === null) {
|
|
throw new OssException("raw response is null");
|
|
}
|
|
$this->rawResponse = $response;
|
|
$this->parseResponse();
|
|
}
|
|
|
|
/**
|
|
* 获取requestId
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getRequestId()
|
|
{
|
|
if (isset($this->rawResponse) &&
|
|
isset($this->rawResponse->header) &&
|
|
isset($this->rawResponse->header['x-oss-request-id'])
|
|
) {
|
|
return $this->rawResponse->header['x-oss-request-id'];
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 得到返回数据,不同的请求返回数据格式不同
|
|
*
|
|
* $return mixed
|
|
*/
|
|
public function getData()
|
|
{
|
|
return $this->parsedData;
|
|
}
|
|
|
|
/**
|
|
* 由子类实现,不同的请求返回数据有不同的解析逻辑,由子类实现
|
|
*
|
|
* @return mixed
|
|
*/
|
|
abstract protected function parseDataFromResponse();
|
|
|
|
/**
|
|
* 操作是否成功
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function isOK()
|
|
{
|
|
return $this->isOk;
|
|
}
|
|
|
|
/**
|
|
* @throws OssException
|
|
*/
|
|
public function parseResponse()
|
|
{
|
|
$this->isOk = $this->isResponseOk();
|
|
if ($this->isOk) {
|
|
$this->parsedData = $this->parseDataFromResponse();
|
|
} else {
|
|
$httpStatus = strval($this->rawResponse->status);
|
|
$requestId = strval($this->getRequestId());
|
|
$code = $this->retrieveErrorCode($this->rawResponse->body);
|
|
$message = $this->retrieveErrorMessage($this->rawResponse->body);
|
|
$body = $this->rawResponse->body;
|
|
|
|
$details = array(
|
|
'status' => $httpStatus,
|
|
'request-id' => $requestId,
|
|
'code' => $code,
|
|
'message' => $message,
|
|
'body' => $body
|
|
);
|
|
throw new OssException($details);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 尝试从body中获取错误Message
|
|
*
|
|
* @param $body
|
|
* @return string
|
|
*/
|
|
private function retrieveErrorMessage($body)
|
|
{
|
|
if (empty($body) || false === strpos($body, '<?xml')) {
|
|
return '';
|
|
}
|
|
$xml = simplexml_load_string($body);
|
|
if (isset($xml->Message)) {
|
|
return strval($xml->Message);
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* 尝试从body中获取错误Code
|
|
*
|
|
* @param $body
|
|
* @return string
|
|
*/
|
|
private function retrieveErrorCode($body)
|
|
{
|
|
if (empty($body) || false === strpos($body, '<?xml')) {
|
|
return '';
|
|
}
|
|
$xml = simplexml_load_string($body);
|
|
if (isset($xml->Code)) {
|
|
return strval($xml->Code);
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* 根据返回http状态码判断,[200-299]即认为是OK
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function isResponseOk()
|
|
{
|
|
$status = $this->rawResponse->status;
|
|
if ((int)(intval($status) / 100) == 2) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 返回原始的返回数据
|
|
*
|
|
* @return ResponseCore
|
|
*/
|
|
public function getRawResponse()
|
|
{
|
|
return $this->rawResponse;
|
|
}
|
|
|
|
/**
|
|
* 标示请求是否成功
|
|
*/
|
|
protected $isOk = false;
|
|
/**
|
|
* 由子类解析过的数据
|
|
*/
|
|
protected $parsedData = null;
|
|
/**
|
|
* 存放auth函数返回的原始Response
|
|
*
|
|
* @var ResponseCore
|
|
*/
|
|
protected $rawResponse;
|
|
} |