andrey-tech/amocrm-api-php

Добавить поддержку 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 =)

Здравствуйте!

  1. Нельзя, ибо HTTP-методы PUT и DELETE не реализованы в трейте AmoAPIRequest за их ненадобностью для API v2. Однако вы всегда можете добавить их самостоятельно, создав свою обертку для данной библиотеки.
  2. Для каждого вопроса, касающегося новой темы, лучше создавать самостоятельный issue.