{"id":22178046,"url":"https://github.com/fi1a/http","last_synced_at":"2025-03-24T18:26:42.940Z","repository":{"id":65002759,"uuid":"580593790","full_name":"fi1a/http","owner":"fi1a","description":"PHP абстракция для HTTP-запроса (request), ответа (response), сессии (session) и cookies.","archived":false,"fork":false,"pushed_at":"2023-02-25T00:40:36.000Z","size":169,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-05T19:51:44.657Z","etag":null,"topics":["cookie","headers","http","php","request","response","session"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fi1a.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-21T00:14:42.000Z","updated_at":"2023-02-06T04:05:00.000Z","dependencies_parsed_at":"2024-12-02T08:45:19.424Z","dependency_job_id":null,"html_url":"https://github.com/fi1a/http","commit_stats":{"total_commits":58,"total_committers":1,"mean_commits":58.0,"dds":0.0,"last_synced_commit":"31adc93a19c5d2d128ae201c4b465904f2b79a60"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fhttp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fhttp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fhttp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fhttp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fi1a","download_url":"https://codeload.github.com/fi1a/http/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245326972,"owners_count":20597125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cookie","headers","http","php","request","response","session"],"created_at":"2024-12-02T08:34:33.267Z","updated_at":"2025-03-24T18:26:42.919Z","avatar_url":"https://github.com/fi1a.png","language":"PHP","readme":"# PHP абстракция для HTTP-запроса (request), ответа (response), сессии (session) и cookies.\n\n[![Latest Version][badge-release]][packagist]\n[![Software License][badge-license]][license]\n[![PHP Version][badge-php]][php]\n![Coverage Status][badge-coverage]\n[![Total Downloads][badge-downloads]][downloads]\n[![Support mail][badge-mail]][mail]\n\nВ PHP HTTP-запрос (request) представлен глобальными переменными ($_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, ...),\nа ответ (response) генерируется функциями (echo, header(), setcookie(), ...)\n\nДанный пакет заменяет эти стандартные глобальные переменные и функции PHP объектно-ориентированным слоем,\nинкапсулируя HTTP-запрос (request) и ответ (response) в объекты `Fi1a\\Http\\RequestInterface` и `Fi1a\\Http\\ResponseInterface`,\nкоторые предлагают удобный API для работы с ними.\n\n## Установка\n\nУстановить этот пакет можно как зависимость, используя Composer.\n\n``` bash\ncomposer require fi1a/http\n```\n\n## Хелперы\n\nВ пакете доступны следующие хелперы:\n\n- http(): HttpInterface - хелпер для HttpInterface;\n- request(?RequestInterface $request = null): RequestInterface - хелпер для текушего запроса;\n- response(?ResponseInterface $response = null): ResponseInterface - хелпер для текушего ответа;\n- session(?SessionStorageInterface $session = null): SessionStorageInterface - хелпер для доступа к сессии;\n- buffer(?BufferOutputInterface $buffer = null): BufferOutputInterface - хелпер для буферизированного вывода;\n- redirect($location = null, ?int $status = null, $headers = []): RedirectResponse - возвращает ответ для реализации перенаправления;\n- json($data = null, ?int $status = null, $headers = []): JsonResponseInterface - возвращает JSON-ответ.\n\n## Dependency injection\n\nКонтейнер dependency injection из пакета [fi1a/dependency-injection](https://github.com/fi1a/dependency-injection)\n\nДля интерфейсов, в контейнере dependency injection, доступны следующие определения:\n\n- Fi1a\\Http\\HttpInterface;\n- Fi1a\\Http\\RequestInterface;\n- Fi1a\\Http\\ResponseInterface;\n- Fi1a\\Http\\Session\\SessionStorageInterface;\n- Fi1a\\Http\\BufferOutputInterface;\n- Fi1a\\Http\\RedirectResponseInterface;\n- Fi1a\\Http\\JsonResponseInterface.\n\n```php\ndi()-\u003eget(Fi1a\\Http\\RequestInterface::class)-\u003eall();\n```\n\n## HTTP-запрос\n\nHTTP-запрос — это объект реализующий интерфейс `Fi1a\\Http\\RequestInterface`. HTTP-запрос является не изменяемым, у него нет сеттеров.\nДля доступа к текущему запросу можно использовать хелпер `request()`.\n\n```php\nrequest()-\u003equery()-\u003eget('foo'); // bar\n```\n\nДоступные методы `Fi1a\\Http\\RequestInterface`:\n\n| Метод                                    | Описание                                   |\n|------------------------------------------|--------------------------------------------|\n| post(): PathAccessInterface              | Возвращает POST                            |\n| query(): PathAccessInterface             | Возвращает GET значения                    |\n| all(): PathAccessInterface               | Все значения из GET, POST, FILES, BODY     |\n| only(array $keys): PathAccessInterface   | Только переданные ключи из GET и POST      |\n| files(): UploadFileCollectionInterface   | Возвращает файлы                           |\n| withRawBody($body)                       | Устанавливает содержание                   |\n| rawBody()                                | Возвращает содержание                      |\n| withBody($body)                          | Устанавливает преобразованное содержание   |\n| body()                                   | Возвращает преобразованное содержание      |\n| cookies(): HttpCookieCollectionInterface | Возвращает cookies                         |\n| headers(): HeaderCollectionInterface     | Вернуть заголовки                          |\n| server(): ServerCollectionInterface      | Возвращает значение SERVER                 |\n| options(): PathAccessInterface           | Возвращает опции                           |\n| clientIp(): string                       | Возвращает IP адрес клиента                |\n| scriptName(): string                     | Возвращает запрошенный файл скрипта        |\n| path(): string                           | Возвращает путь                            |\n| basePath(): string                       | Путь без файла                             |\n| normalizedBasePath(): string             | Путь без файла с / на конце                |\n| queryString(): string                    | Возвращает строку запроса                  |\n| host(): string                           | Хост                                       |\n| httpHost(): string                       | Хост и порт, если он не стандартный        |\n| schemeAndHttpHost(): string              | Схема, хост и порт                         |\n| isSecure(): bool                         | Использован https                          |\n| scheme(): string                         | Возвращает схему запроса                   |\n| port(): int                              | Возвращает порт                            |\n| user(): string                           | Возвращает пользователя                    |\n| password(): ?string                      | Возвращает пароль                          |\n| userInfo(): string                       | Возвращает пользователя и пароль           |\n| pathAndQuery(): string                   | Возвращает путь и строку запроса           |\n| uri(): string                            | Возвращает урл с хостом и строку запроса   |\n| method(): string                         | Возвращает метод                           |\n| isMethod(string $method): bool           | Определяет метод                           |\n| contentType(): string                    | Возвращает тип содержания                  |\n| isNoCache(): bool                        | Без кеша                                   |\n| isXmlHttpRequest(): bool                 | Возвращает true если запрос XMLHttpRequest |\n| eTags(): array                           | Возвращает ETags                           |\n| script(): string                         | Возвращает путь до выполняемого скрипта    |\n\nМетоды post(), query(), all(), only(array $keys), options() возвращают результат в виде объекта, реализующего\n`Fi1a\\Collection\\DataType\\PathAccessInterface` из пакета [fi1a/collection](https://github.com/fi1a/collection)\n\n### JSON-запрос\n\nЕсли был передан заголовок `Content-Type: application/json` при запросе клиентом, то промежуточное ПО автоматически декодирует тело запроса\nиз JSON-формата.\nДля того чтобы, получить доступ к декодированному значению вызовите метод `body()`:\n\n```php\nrequest()-\u003erawBody(); // {\"foo\":\"bar\"}\nrequest()-\u003ebody(); // ['foo' =\u003e 'bar']\n```\n\n### uri()\n\nВозвращает URL-адрес запроса\n\n```php\nrequest()-\u003euri(); // https://domain.ru/path/?foo=bar\n```\n\n### query()\n\nВозвращает GET параметры запроса:\n\n```php\nrequest()-\u003equery()-\u003eget('foo'); // bar\n```\n\n### post()\n\nВозвращает POST параметры запроса:\n\n```php\nrequest()-\u003epost()-\u003eget('foo'); // bar\n```\n\n### all()\n\nВозвращает GET, POST, FILES, BODY параметры запроса:\n\n```php\nrequest()-\u003eall()-\u003eget('foo'); // bar\n```\n\n### only()\n\nТолько переданные ключи из параметров GET и POST:\n\n```php\nrequest()-\u003eonly(['foo'])-\u003eget('foo'); // bar\n```\n\n### files()\n\nВозвращает коллекцию `Fi1a\\Http\\UploadFileCollectionInterface` загруженных файлов `Fi1a\\Http\\UploadFileInterface`:\n\n```php\n$collection = request()-\u003efiles();\n$uploadFile = $collection-\u003eget('some:file1');\n$uploadFile-\u003egetName(); // file.txt\n```\n\n### cookies()\n\nВозвращает коллекцию `Fi1a\\Http\\HttpCookieCollectionInterface` cookies `Fi1a\\Http\\HttpCookieInterface`:\n\n```php\n$collection = request()-\u003ecookies();\n$cookie = $collection-\u003egetByName('cookieName');\n$cookie-\u003egetValue(); // cookieValue\n```\n\n### method()\n\nВозвращает HTTP метод, с помощью которого был сделан запрос.\n\n```php\nrequest()-\u003emethod(); // POST\n```\n\n### headers()\n\nВозвращает все HTTP заголовки:\n\n```php\n$headers = request()-\u003eheaders();\n$header = $headers-\u003egetLastHeader('X-Header');\n$header-\u003egetValue(); // HeaderValue\n```\n\n## HTTP-ответ\n\nHTTP-ответ представляет собой объект `Fi1a\\Http\\ResponseInterface`.\nОн содержит всю информацию, которая должна быть отправлена клиенту для текущего запроса.\nКонструктор принимает до трех аргументов: статус ответа, массив заголовков HTTP и объект запроса `Fi1a\\Http\\RequestInterface`.\nДля доступа к текущему ответу можно использовать хелпер `response()`.\n\n```php\nuse \\Fi1a\\Http\\ResponseInterface;\n\n$response = response()-\u003ewithStatus(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);\nresponse($response);\n```\n\nУстановить новый текущий ответ:\n\n```php\nuse Fi1a\\Http\\Response;\nuse Fi1a\\Http\\ResponseInterface;\n\n$response = new Response(ResponseInterface::HTTP_NOT_FOUND);\nresponse($response);\n```\n\nДоступные методы `Fi1a\\Http\\ResponseInterface`:\n\n| Метод                                                 | Описание                                              |\n|-------------------------------------------------------|-------------------------------------------------------|\n| withStatus(int $status, ?string $reasonPhrase = null) | Устанавливает код и текст ответа                      |\n| status(): int                                         | Возвращает код ответа                                 |\n| reasonPhrase(): ?string                               | Возвращает текст ответа                               |\n| withHeaders(HeaderCollectionInterface $headers)       | Устанавливает заголовки                               |\n| headers(): HeaderCollectionInterface                  | Возвращает заголовки                                  |\n| withHeader(string $name, string $value)               | Добавляет заголовок с определенным именем и значением |\n| withoutHeader(string $name)                           | Удалить заголовки с определенным именем               |\n| hasHeader(string $name): bool                         | Проверяет наличие заголовка                           |\n| cookies(): HttpCookieCollectionInterface              | Возвращает cookies                                    |\n| withCookies(HttpCookieCollectionInterface $cookies)   | Устанавливает cookies                                 |\n| withHttpVersion(string $version)                      | Устанавливает версию HTTP протокола                   |\n| httpVersion(): string                                 | Возвращает HTTP версию протокола                      |\n| isEmpty(): bool                                       | Если true, то ответ пустой                            |\n| isInformational(): bool                               | Если true, то ответ информационный                    |\n| isSuccessful(): bool                                  | Если true, то ответ успешный                          |\n| isClientError(): bool                                 | Если true, то клиентская ошибка                       |\n| isServerError(): bool                                 | Если true, то серверная ошибка                        |\n| isOk(): bool                                          | Если true, то ответ 200 OK                            |\n| isForbidden(): bool                                   | Если true, то 403 Forbidden                           |\n| isNotFound(): bool                                    | Если true, то 404 Not found                           |\n| isRedirection(?string $location = null): bool         | Если true, то перенаправление                         |\n| withCharset(string $charset)                          | Устанавливает кодировку                               |\n| charset(): string                                     | Возвращает кодировку                                  |\n| withDate(DateTime $date)                              | Устанавливает дату                                    |\n| date(): DateTime                                      | Возвращает дату                                       |\n| lastModified(): ?DateTime                             | Возвращает время последнего изменения                 |\n| withLastModified(?DateTime $date = null)              | Устанавливает время последнего изменения              |\n\n\n### withStatus(int $status, ?string $reasonPhrase = null)\n\nУстанавливает код ответа состояния.\nРекомендуется использовать предопределенные константы `Fi1a\\Http\\ResponseInterface::HTTP_OK`, ... вместо реальных чисел.\n\n```php\nuse Fi1a\\Http\\ResponseInterface;\n\n$response = response()-\u003ewithStatus(ResponseInterface::HTTP_OK, 'OK');\nresponse($response);\n```\n\n### withHeader(string $name, string $value)\n\nДобавляет заголовок с определенным именем и значением к ответу:\n\n```php\n$response = response()-\u003ewithHeader('X-Header', 'Value');\nresponse($response);\n```\n\n### withoutHeader(string $name)\n\nУдалить заголовки с определенным именем:\n\n```php\n$response = response()-\u003ewithoutHeader('X-Header');\nresponse($response);\n```\n\n### cookies\n\nВозвращает cookies.\nДля того чтобы установить новую cookie, нужно добавить ее в коллекцию как в примере:\n\n```php\nuse Fi1a\\Http\\HttpCookie;\n\n$cookie = new HttpCookie();\n$cookie-\u003esetDomain('domain.ru');\n$cookie-\u003esetName('CookieName');\n$cookie-\u003esetPath('/');\n$cookie-\u003esetValue('Value');\n\n$response = response();\n$response-\u003ecookies()-\u003eadd($cookie);\n\nbuffer()-\u003esendHeaders($response);\n```\n\nCookie будет установлена при вызове метода `sendHeaders` класса `Fi1a\\Http\\OutputInterface`.\n\n_В  фреймворке Elpha, нет необходимости вызывать метод `sendHeaders` класса `Fi1a\\Http\\BufferOutputInterface`,\nфреймворк это сделает за вас._\n\n## Отправка ответа\n\nОтправка ответа клиенту осуществляется вызовом метода `send()` класса, реализующего интерфейс `Fi1a\\Http\\BufferOutputInterface`:\n\n```php\nbuffer()-\u003esend(response());\n```\n\n_В  фреймворке Elpha, нет необходимости вызывать метод `send` класса `Fi1a\\Http\\BufferOutputInterface`,\nфреймворк это сделает за вас._\n\n## Перенаправление\n\nПеренаправление реализуется ответом с интерфейсом `Fi1a\\Http\\RedirectResponseInterface`.\nМожно воспользоваться хелперами:\n\n```php\nuse Fi1a\\Http\\ResponseInterface;\n\nresponse(redirect()-\u003eto('/redirect/path', ResponseInterface::HTTP_MOVED_PERMANENTLY))\n```\n\nС помощью хелпера `redirect` мы создает ответ с перенаправлением по адресу '/redirect/path'\nи статусом ResponseInterface::HTTP_MOVED_PERMANENTLY и устанавливаем его используя `response`.\n\n## JSON-ответ\n\nJSON-ответ реализуется интерфейсом `Fi1a\\Http\\JsonResponseInterface`.\nМожно воспользоваться хелперами:\n\n```php\nresponse(json()-\u003edata(['foo' =\u003e 'bar']));\n```\n\nС помощью хелпера `json` мы создает JSON-ответ и устанавливаем его используя `response`.\nПосле установки JSON-ответа, промежуточное ПО устанавливает необходимые заголовки и выводит результат.\n\n## Сессия\n\nЕсли у вас есть сессия, вы можете получить к ней доступ через хелпер `session()`.\nСессия имеет интерфейс `Fi1a\\Http\\SessionStorageInterface`.\nПеред тем как получать или устанавливать значения в сессию, ее нужно открыть с помощью метода `open()`.\n\n_В  фреймворке Elpha, нет необходимости открывать сессию, фреймворк это сделает за вас._\n\n```php\n$session = session();\nif (!$session-\u003eisOpen()) {\n    $session-\u003eopen();\n}\n\n$session-\u003egetValues()-\u003eset('foo:bar', 'baz');\n$session-\u003egetValues()-\u003eget('foo:bar'); // baz\n\n$session-\u003eclose();\n```\n\n## Flush\n\nСохраняет значение в сессии. После получения значения, стирает его.\n\n```php\nuse Fi1a\\Http\\Flush;\n\nif (!session()-\u003eisOpen()) {\n    session()-\u003eopen();\n}\n\n$flush = new Flush();\n\n$flush-\u003eset('foo', 'bar');\n\n$flush-\u003eget('foo'); // bar\n$flush-\u003eget('foo'); // null\n```\n\n## Uri\n\nКласс реализующий интрефейс `Fi1a\\Http\\UriInterface` упрощает работу с URI и с его отдельными компонентами:\n\n```\nhttps://user:password@domain.ru:8080/url/path/?foo=bar#fragment\n|----| |---| |------| |-------| |---||-------| |-----| |------|\n  |      |      |        |        |     |         |        |\nscheme  user password   host     port  path     query   fragment\n```\n\nГенерация Uri:\n\n```php\nuse Fi1a\\Http\\Uri;\n\n$uri = new Uri();\n\n$uri = $uri-\u003ewithScheme('https')\n    -\u003ewithHost('domain.ru')\n    -\u003ewithPath('/path/')\n    -\u003ewithQueryParams([\n        'foo' =\u003e 'bar',\n    ]);\n\n$uri-\u003euri(); // \"https://domain.ru/path/?foo=bar\"\n```\n\nВы также можете задать URL-адрес строкой, а затем использовать его компоненты:\n\n```php\nuse Fi1a\\Http\\Uri;\n\n$uri = new Uri('https://domain.ru/path/?foo=bar');\n\n$uri-\u003ehost(); // \"domain.ru\"\n$uri-\u003epath(); // \"/path/\"\n```\n\nДоступные методы `Fi1a\\Http\\UriInterface`:\n\n| Метод                                                | Описание                                      |\n|------------------------------------------------------|-----------------------------------------------|\n| scheme(): string                                     | Схема                                         |\n| withScheme(string $scheme)                           | Задать схему                                  |\n| isSecure(): bool                                     | Использован https                             |\n| userInfo(): string                                   | Компонент информации о пользователе URI       |\n| user(): string                                       | Возвращает имя пользователя                   |\n| password(): ?string                                  | Возвращает пароль                             |\n| withUserInfo(string $user, ?string $password = null) | Задать информацию о пользователе              |\n| host(): string                                       | Хост                                          |\n| withHost(string $host)                               | Задать хост                                   |\n| port(): ?int                                         | Порт                                          |\n| withPort(?int $port)                                 | Задать порт                                   |\n| path(): string                                       | Часть пути URI                                |\n| withPath(string $path)                               | Установить часть пути URI                     |\n| basePath(): string                                   | Урл без файла                                 |\n| normalizedBasePath(): string                         | Урл без файла с / на конце                    |\n| query(): string                                      | Строка запроса в URI                          |\n| withQuery(string $query)                             | Задать строку запроса URI                     |\n| queryParams(): PathAccessInterface                   | Массив запроса в URI                          |\n| withQueryParams($queryParams)                        | Задать массив запроса в URI                   |\n| fragment(): string                                   | Фрагмент URI                                  |\n| withFragment(string $fragment)                       | Задать фрагмент URI                           |\n| url(): string                                        | Возвращает URL                                |\n| uri(): string                                        | Возвращает URI                                |\n| pathAndQuery(): string                               | Возвращает путь и строку запроса              |\n| authority(): string                                  | Компонент полномочий URI                      |\n| maskedUri(): string                                  | Возвращает URI с маской на данных авторизации |\n| replace(string $uri = '', array $variables = [])     | Заменить адрес переданным значением           |\n| isRelative(): bool                                   | Относительный uri или нет                     |\n\n[badge-release]: https://img.shields.io/packagist/v/fi1a/http?label=release\n[badge-license]: https://img.shields.io/github/license/fi1a/http?style=flat-square\n[badge-php]: https://img.shields.io/packagist/php-v/fi1a/http?style=flat-square\n[badge-coverage]: https://img.shields.io/badge/coverage-100%25-green\n[badge-downloads]: https://img.shields.io/packagist/dt/fi1a/http.svg?style=flat-square\u0026colorB=mediumvioletred\n[badge-mail]: https://img.shields.io/badge/mail-support%40fi1a.ru-brightgreen\n\n[packagist]: https://packagist.org/packages/fi1a/http\n[license]: https://github.com/fi1a/http/blob/master/LICENSE\n[php]: https://php.net\n[downloads]: https://packagist.org/packages/fi1a/http\n[mail]: mailto:support@fi1a.ru","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Fhttp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffi1a%2Fhttp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Fhttp/lists"}