123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <?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;
- }
|