Перейти к содержанию

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,
        ]
    );
    

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

```json
{
    "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));

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

Класс 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']
    ]
]
*/