/** * Конструктор * * @param string $error Ошибка * @param string $description Описание ошибки * @param Pro_Api_Dialogue $dialogue Диалог */ public function __construct($error, $description, Pro_Api_Dialogue $dialogue = null) { $this->error = $error; $this->dialogue = $dialogue; $this->description = $description; parent::__construct($error, $dialogue ? $dialogue->getHttpCode() : 500); }
/** * Выполнить запрос * * @param string $url Адрес API метода * @param mixed $parameters Параметры запроса * @param string|null $method HTTP метод запроса * @param boolean|null $debug Режим отладки * * @return Pro_Api_Dialogue */ private function executeRequest($url, array $parameters = array(), $method = self::HTTP_GET, $debug = self::DEFAULT_DEBUG_MODE) { // параметры из url передаются в список параметров if (strpos($url, '?') !== false) { list($url, $url_params) = explode('?', $url, 2); parse_str($url_params, $url_params); $parameters = $url_params + $parameters; } $curl_options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_FOLLOWLOCATION => true, CURLOPT_URL => $url); // в режиме отладки сохраняем заголовки if ($debug) { $curl_options[CURLINFO_HEADER_OUT] = true; $curl_options[CURLOPT_HEADER] = true; } switch ($method) { case self::HTTP_GET: $url .= '?' . http_build_query($parameters); $curl_options[CURLOPT_URL] = $url; break; case self::HTTP_POST: $curl_options[CURLOPT_POST] = true; case self::HTTP_PUT: case self::HTTP_DELETE: $curl_options[CURLOPT_POSTFIELDS] = http_build_query($parameters); break; default: throw new Pro_Api_Exception('no_support_method', 'Неподдерживаемый метод запроса', null); } $ch = curl_init(); curl_setopt_array($ch, $curl_options); $dialogue = new Pro_Api_Dialogue(curl_exec($ch), $ch, $url, $parameters, $debug); curl_close($ch); $json_decode = $dialogue->getJsonDecode(); if ($dialogue->getHttpCode() != 200) { $code = $dialogue->getHttpCode(); $desc = 'Неизвестная ошибка'; if (isset($json_decode['error'], $json_decode['description'])) { $code = $json_decode['error']; $desc = $json_decode['description']; // токен устарел if ($code == 'invalid_token') { $this->refreshAccessToken(); $parameters[self::NAME_ACCESS_TOKEN] = $token; return $this->executeRequest($url, $parameters, $method, $debug); } // токен не найден if ($code == 'undefined_token') { $this->access_token = null; $this->access_token_expires = null; } } elseif (isset($json_decode['code'], $json_decode['error'])) { $code = $json_decode['code']; $desc = $json_decode['error']; } throw new Pro_Api_Exception($code, $desc, $dialogue); } return $dialogue; }