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