Request и Response

Запрос (Request)

Request — это абстрактный класс, который предоставляет информацию о текущем запросе. Он позволяет узнать метод и протокол, запрошенный URL, переданные параметры и другие данные. Класс расширяет \Bitrix\Main\Type\ParameterDictionary.

Класс обращается к пространствам имен:

  • \Main\Type — работает с типами данных,

  • \Main\IO — работает с файлами,

  • \Main\Text — работает с текстом.

Пример использования:

use Bitrix\Main\Application;
        use Bitrix\Main\Context;
        
        $context = Application::getInstance()->getContext();
        $request = $context->getRequest();
        
        // Или более кратко:
        $request = Context::getCurrent()->getRequest();
        

Параметры запроса

  • Получить параметр GET или POST

    $value = $request->get("param");
            $value = $request["param"];
            
  • Получить GET-параметры

    $value = $request->getQuery("param"); // получить параметр param
            $values = $request->getQueryList(); // получить список всех параметров
            
  • Получить POST-параметры

    $value = $request->getPost("param"); // получить параметр param
            $values = $request->getPostList(); // получить список всех параметров
            
  • Получить загруженный файл

    $value = $request->getFile("param"); // получить файл param
            $values = $request->getFileList(); // получить список всех загруженных файлов
            
  • Получить значение cookie

    $value = $request->getCookie("param"); // получить cookie param
            $values = $request->getCookieList(); // получить список всех cookies
            

Данные о запросе

  • Получить метод запроса

    $method = $request->getRequestMethod();
            
  • Проверить тип запроса

    $flag = $request->isGet(); // вернет true, если GET-запрос
            $flag = $request->isPost(); // вернет true, если POST-запрос
            $flag = $request->isAjaxRequest(); // вернет true, если AJAX-запрос
            $flag = $request->isHttps(); // вернет true, если HTTPS-запрос
            

Данные о запрошенной странице

  • Проверить нахождение в административном разделе

    $flag = $request->isAdminSection(); // вернет true, если находимся в административном разделе
            
  • Получить запрошенный адрес

    $requestUri = $request->getRequestUri(); // например, "/catalog/category/?param=value"
            
  • Получить запрошенную страницу

    $requestPage = $request->getRequestedPage(); // например, "/catalog/category/index.php"
            
  • Получить директорию запрошенной страницы

    $rDir = $request->getRequestedPageDirectory(); // например, "/catalog/category"
            

Класс HttpRequest

HttpRequest — это класс, который управляет объектом Request. Он содержит информацию о текущем запросе, включая его тип и параметры. Этот класс помогает избежать использования глобальных переменных, которые применялись в старом ядре.

Создавать объект HttpRequest вручную не требуется. Его можно получить через приложение и контекст:

use Bitrix\Main\Application;
        
        $request = Application::getInstance()->getContext()->getRequest();
        $name = $request->getPost("name");
        $email = htmlspecialchars($request->getQuery("email"));
        

Ответ (Response)

Класс \Bitrix\Main\HttpResponse — это базовый класс для работы с HTTP-ответами. Он служит контейнером для:

HTTP-заголовков \Bitrix\Main\Web\HttpHeaders

  • Добавить заголовок

    \Bitrix\Main\HttpResponse::addHeader(
                $name,
                $value
            )
            
  • Установить заголовок

    \Bitrix\Main\HttpResponse::setHeaders(
                Web\HttpHeaders $headers
            )
            
  • Получить заголовок

    \Bitrix\Main\HttpResponse::getHeaders()
            

Cookies \Bitrix\Main\Web\Cookie

  • Добавить cookie

    \Bitrix\Main\HttpResponse::addCookie(
                Web\Cookie $cookie,
                $replace,
                $checkExpires
            )
            
  • Получить cookies

    \Bitrix\Main\HttpResponse::getCookies()
            

Контента \Bitrix\Main\HttpResponse::$content

  • Установить контент

    \Bitrix\Main\HttpResponse::setContent(
                $content
            )
            
  • Получить контент

    \Bitrix\Main\HttpResponse::getContent()
            

С помощью HttpResponse можно формировать ответы приложения любого типа и содержания.

$response = new \Bitrix\Main\HttpResponse();
        $response->addHeader('Content-Type', 'text/plain'); // добавить заголовок
        $response->addCookie(new \Bitrix\Main\Web\Cookie('Biscuits', 'Yubileynoye')); // добавить cookie
        $response->setContent('Hello, world!'); // установить контент
        

Стандартные форматы ответов

  • AjaxJson — методы для JSON-ответов. Все ответы от контроллеров \Bitrix\Main\Engine\Controller имеют структуру, понятную для JS API BX.ajax.runAction, BX.ajax.runComponentAction.

    {
                "status": "string",
                "data": "mixed",
                "errors": []
            }
            
  • Json — формирует JSON-ответ. Преобразует данные в JSON, конвертирует в UTF-8 и устанавливает заголовок application/json; charset=UTF-8.

    new \Bitrix\Main\Engine\Response\Json('ping-pong');
            /**
             Content-Type: application/json; charset=UTF-8
            "ping-pong"
            **/
            
            new \Bitrix\Main\Engine\Response\Json([
                'id' => 2208,
                'type' => 'license',
            ]);
            /**
             Content-Type: application/json; charset=UTF-8
            {"id": 2208, "type": "license"}
            **/
            
  • Component — работает с компонентами. Для загрузки компонента через AJAX:

    new \Bitrix\Main\Engine\Response\Component(
                'bitrix:disk.file.view',
                '',
                [
                    'FILE_ID' => $fileId,
                ]
            );
            

    Формирует ответ для представления компонента:

    {
                "status": string,
                "data": {
                    "html": string,
                        "assets": {
                            "css": array,
                            "js": array,
                            "string": array
                        },
                    "additionalParams": array      
                },
                "errors": array
            }
            

Файлы и изображения

  • BFile — работает с файлами. Используется для скачивания файлов из таблицы b_file.

  • ResizedImage — уменьшает изображения.

  • Zip/Archive — работает с архивом. Для NGINX можно использовать расширение mod_zip для создания архивов без нагрузки на PHP.

    use \Bitrix\Main\Engine\Response;
            $archive = new Response\Zip\Archive('archive.zip');
            $archive->addEntry(Response\Zip\ArchiveEntry::createFromFileId($fileId));
            
  • Zip/ArchiveEntry — описывает элемент zip-архива.

Управление ответом

Класс Redirect автоматически делает:

  • проверки безопасности,

  • редирект с 301 или 302 статусом.

// сделать переадресацию с 302 статусом
        $response = new \Bitrix\Main\Engine\Response\Redirect('/auth');   
        
        // сделать переадресацию с 301 статусом
        $response = new \Bitrix\Main\Engine\Response\Redirect('/auth');
        $response->setStatus('301 Moved Permanently');
        

Преобразование данных

Класс Converter конвертирует строки и массивы. Для настройки преобразований класс использует битовые маски.

Константа Описание
TO_SNAKE Перевести в snake_case.
TO_SNAKE_DIGIT Перевести в snake_case с поддержкой цифр.
TO_CAMEL Перевести в camelCase.
TO_UPPER Перевести в верхний регистр.
TO_LOWER Перевести в нижний регистр.
LC_FIRST Перевести первую букву в нижний регистр.
UC_FIRST Перевести первую букву в верхний регистр.
KEYS Применить преобразования к ключам ассоциативного массива.
VALUES Применить преобразования к значениям массива.
RECURSIVE Выполнить преобразования рекурсивно для массива и вложенных массивов.

Есть предустановленный формат Converter::OUTPUT_JSON_FORMAT, который использует константы: TO_CAMEL, KEYS, RECURSIVE.

Методы класса:

  • __construct($format) — создает объект с заданными преобразованиями,

  • process($data) — применяет преобразования к строке или массиву,

  • getFormat(): int — возвращает текущий формат,

  • setFormat($format) — устанавливает новый формат,

  • toJson() — создает объект с форматом OUTPUT_JSON_FORMAT.

use \Bitrix\Main\Engine\Response\Converter;
        
        // Преобразование строки: первая буква в нижний регистр + camelCase
        $converter = new Converter(Converter::LC_FIRST | Converter::TO_CAMEL);
        echo $converter->process('la_la_land'); // laLaLand
        
        // Подготовка массива для JSON-ответа
        $converter = new Converter(Converter::OUTPUT_JSON_FORMAT);
        $result = $converter->process([
            'CATEGORIES' => [
                ['ID' => 1, 'NAME' => 'Foods'],
                ['ID' => 12, 'NAME' => 'Auto'],
            ]
        ]);
        /*
        [
            'categories' => [
                ['id' => 1, 'name' => 'foods'],
                ['id' => 12, 'name' => 'auto'],
            ],
        ]
        */
        
        // Комбинация преобразований
        $converter = new Converter(
            Converter::TO_SNAKE_DIGIT | 
            Converter::KEYS | 
            Converter::VALUES | 
            Converter::RECURSIVE
        );
        $result = $converter->process([
            'property109',
            'props' => [
                'element1' => ['property210']
            ]
        ]);
        /*
        [
            'property_109',
            'props' => [
                'element_1' => ['property_210']
            ]
        ]
        */
        
Следующая