Добавить поддержку Ajax
zhalil opened this issue · 6 comments
Здравствуйте! Хотелось бы добавить поддержку ajax запросов для request, т.к. частенько многим приходиться обращаться к фронтенд методам, хоть можно и дописать самому, но когда это уже 20+ раз ловишь себя на мысли для просьбы добавления фичи
Добрый день! Попробуйте подробнее, с примерами PHP-кода, описать о чем идет речь.
Добрый день! Попробуйте подробнее, с примерами PHP-кода, описать о чем идет речь.
класс AmoAPIRequest.php
метод request
в свиче где выбирается метод добавить кейс:
case 'AJAX':
// Кодируем тело запроса
$ajaxParams = http_build_query($params);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, $ajaxParams );
// Добавляем заголовки HTTP
self::setHTTPHeaders($curl, $subdomain, true,true);
// Отладочная информация
$ajaxParams = self::unescapeUnicode($ajaxParams);
$requestInfo = " (POST: {$url} {$ajaxParams})";
self::debug('['. self::$requestCounter . "] AJAX: {$url}" . PHP_EOL . $ajaxParams);
break;
метод setHTTPHeaders
добавить возможность включения ajax заголовков, пример :
protected static function setHTTPHeaders($curl, string $subdomain, bool $isPost,bool $ajax = false)
{
// Список НТТP-заголовков
$headers = [];
// Если авторизация по протоколу OAuth 2.0, то добавляем заголовок Authorization:
if (self::$lastAuth[ $subdomain ]['is_oauth2']) {
// Если установлен access token
if (! empty(self::$lastAuth[ $subdomain ]['access_token'])) {
$headers[] = 'Authorization: Bearer ' . self::$lastAuth[ $subdomain ]['access_token'];
}
}
// Если метод запроса POST, то добавляем заголовок Content-Type:
if ($isPost) {
if($ajax){
$headers[] = 'X-Requested-With: XMLHttpRequest';
}else{
$headers[] = 'Content-Type: application/json';
}
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
пример для чего нужно : например для обращения к фильтрам амо(нормальным и рабочим а не тем что в апи альфе), пример фильтрации по дате :
AmoAPI::oAuth2($this->domain);
$params = [
'filter'=>['cf'=>[
'681165'=>[
'from'=>'30.03.2022',
'to'=>'30.03.2022'
]],
],
'useFilter'=>'y',
'element_type'=>1,
'json'=>1,
'page'=>1
];
$data = \AmoCRM\AmoAPI::request(
'/ajax/contacts/list',
'AJAX',
$params
);
return $data;
И если возможно при совершении ajax запроса, хендлить 202 как удовлетворительный ответ сервера, т.к. он часто им отвечает, я сделал по колхозному и просто пропускаю 202 всегда ибо нет моментов когда у нас недостаточно прав
// Проверяем код статуса HTTP
if ($code !== 200 && $code !== 204 && $code != 202) {
throw new AmoAPIException(self::getErrorMessage($code) . ": {$requestInfo} (Response: {$result})", $code);
}
пример ответа:
этим дело не ограничивается, например частенько необходимо клиентам загрузка/выгрузка файлов из переписок, без ajax методов это сделать невозможно
Думаю ваши доработки можно было бы включить в следующий релиз библиотеки, раз "частенько многим приходиться обращаться к фронтенд методам". Оформите их в виде Pull Request.
И если возможно при совершении ajax запроса, хендлить 202 как удовлетворительный ответ сервера, т.к. он часто им отвечает, я сделал по колхозному и просто пропускаю 202 всегда ибо нет моментов когда у нас недостаточно прав
Такого решения вполне достаточно, ибо код состояния HTTP 202 из-за недостатка прав здесь не вернется.
Целесообразно было бы вообще вынести коды состояния HTTP в публичное статическое свойство класса AmoAPIRequest
, дабы можно было при необходимости их изменять:
/**
* Коды состояния НТТР, соответствующие успешному выполнению запроса
* @var array
*/
public static $successStatusCodes = [ 200, 204 ];
Поддержка AJAX-запросов к frontend-методам добавлена в релиз v2.18.0.
Здравствуйте,
уточните пожалуйста можно ли использовать методы PUT и DELETE?
Хочу использовать вашу библиотеку для v4
Методы
PATCH /api/v4/leads/custom_fields/groups/{id}
DELETE /api/v4/leads/custom_fields/groups/{id}
ps я в курсе, что она для v2 =)
Здравствуйте!
- Нельзя, ибо HTTP-методы
PUT
иDELETE
не реализованы в трейтеAmoAPIRequest
за их ненадобностью для API v2. Однако вы всегда можете добавить их самостоятельно, создав свою обертку для данной библиотеки. - Для каждого вопроса, касающегося новой темы, лучше создавать самостоятельный issue.