https://github.com/stivo182/oscript-httpbin
Cервис для тестирования и отладки HTTP-запросов
https://github.com/stivo182/oscript-httpbin
api hacktoberfest http http-server httpbin oscript testing
Last synced: 11 days ago
JSON representation
Cервис для тестирования и отладки HTTP-запросов
- Host: GitHub
- URL: https://github.com/stivo182/oscript-httpbin
- Owner: Stivo182
- License: mit
- Created: 2025-01-22T12:14:04.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-12-15T01:51:18.000Z (about 1 month ago)
- Last Synced: 2025-12-17T17:59:39.171Z (about 1 month ago)
- Topics: api, hacktoberfest, http, http-server, httpbin, oscript, testing
- Language: 1C Enterprise
- Homepage:
- Size: 689 KB
- Stars: 18
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# httpbin
[](https://github.com/Stivo182/oscript-httpbin/releases)
[](https://github.com/stivo182/oscript-httpbin/actions/workflows/test.yml)
[](https://sonar.openbsl.ru/dashboard?id=httpbin)
Локальный сервис для тестирования и отладки HTTP-запросов, реализованный на [OneScript](https://github.com/EvilBeaver/OneScript) с использованием фреймворка [WINOW](https://github.com/autumn-library/winow).
Проект предоставляет функциональность, аналогичную [httpbin.org](https://httpbin.org/), поддерживая большинство оригинальных эндпоинтов.
* 1\. [Установка](#installation)
* 2\. [Использование](#usage)
* 2.1\. [CLI](#cli)
* 2.2\. [Тестирование через OneUnit](#testing-oneunit)
* 2.3\. [Тестирование через 1testrunner](#testing-1testrunner)
* 2.4\. [Swagger UI](#swagger-ui)
* 3\. [Совместимость](#compatibility)
* 4\. [Программный интерфейс](#api)
* 5\. [Пользовательские эндпоинты](#custom-endpoints)
* 6\. [Ограничения](#limitations)
* 7\. [Сравнение с httpbin.org](#comparison)
``` bash
opm install httpbin
```
Запустите сервис с помощью команды:
``` bash
httpbin run
```
После запуска сервис будет доступен по адресу: `http://127.0.0.1:3333`
#### Опции команды:
| Опция | Описание | Значение по умолчанию |
| --- | --- | --- |
| `-h`, `--host` | Имя хоста или IP-адрес сервиса | `127.0.0.1` |
| `-p`, `--port` | TCP-порт сервиса | `3333` |
| `-r`, `--routes`, `--routes-handlers` | Путь к файлу или каталогу с пользовательскими контроллерами | |
### Тестирование через [OneUnit](https://github.com/sfaqer/OneUnit)
``` bsl
# test.os
#Использовать asserts
#Использовать 1connector
#Использовать httpbin
Перем HttpBin;
&ТестовыйНабор(Характер = "Одиночка")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
&ПередВсеми
Процедура ПередЗапускомТестов() Экспорт
HttpBin = Новый HttpBin();
HttpBin.Запустить();
КонецПроцедуры
&ПослеВсех
Процедура ПослеЗапускаТестов() Экспорт
HttpBin.Остановить();
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьПараметрыЗапроса() Экспорт
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("key", "value");
Ответ = КоннекторHTTP.Get(HttpBin.URL("/get"), ПараметрыЗапроса);
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Содержит("application/json");
Ожидаем.Что(Ответ.Json()["args"]["key"]).Равно("value");
КонецПроцедуры
```
### Тестирование через [1testrunner](https://github.com/artbear/1testrunner)
``` bsl
# test.os
#Использовать asserts
#Использовать 1connector
#Использовать httpbin
Перем HttpBin;
&Инициализация
Процедура ПередЗапускомТестов() Экспорт
HttpBin = Новый HttpBin();
HttpBin.Запустить();
КонецПроцедуры
&Завершение
Процедура ПослеЗапускаТестов() Экспорт
HttpBin.Остановить();
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьПараметрыЗапроса() Экспорт
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("key", "value");
Ответ = КоннекторHTTP.Get(HttpBin.URL("/get"), ПараметрыЗапроса);
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Содержит("application/json");
Ожидаем.Что(Ответ.Json()["args"]["key"]).Равно("value");
КонецПроцедуры
```
### Swagger UI
На стартовой странице сервиса (по умолчанию: `http://127.0.0.1:3333`) доступна интерактивная документация API через **Swagger UI**, а также возможность отправки запросов и получения ответов.
Поддерживаемые платформы и версии OneScript::
| ОС | OneScript 1.9 | OneScript 2.0 |
| --- | --- | --- |
| **Windows** | ✅ | ✅ |
| **Linux** | ✅ | ✅ |
| **MacOS** | ✅ | ✅ |
### Класс `HttpBin`
Класс предназначен для управления жизненным циклом локального HTTP-сервиса.
Поддерживает текучий интерфейс (fluent API).
#### Синтаксис
`Новый HttpBin(<Хост>, <Порт>)`
#### Параметры
<Хост> (необязательный)
Тип: _Строка_.
IP-адрес или имя хоста.
По умолчанию: _127.0.0.1_
<Порт> (необязательный)
Тип: _Число_.
Номер TCP-порта.
По умолчанию: _3333_
#### Методы
| Метод | Описание |
| --- | --- |
| `Запустить()` | Запускает сервис в синхронном режиме с ожиданием полной готовности. |
| `ЗапуститьАсинх()` | Запускает сервис в асинхронном режиме без ожидания готовности. |
| `Остановить()` | Останавливает сервис. |
| `ОжидатьЗавершения()` | Ожидает завершения работы сервиса, приостанавливая выполнение текущего потока. |
| `Отвечает()` | Проверяет доступность сервиса через HTTP-запрос. |
| `Активен()` | Проверяет, что процесс сервиса запущен и не завершен. |
| `Порт()` | Возвращает номер TCP-порта, на котором работает сервис. |
| `УстановитьПорт(<Порт>)` | Устанавливает TCP-порт для запуска сервиса. |
| `Хост()` | Возвращает имя хоста или IP-адрес сервиса. |
| `УстановитьХост(<Хост>)` | Устанавливает имя хоста или IP-адрес для запуска сервиса. |
| `URL(<АдресРесурса>)` | Формирует полный URL-адрес сервиса с опциональным путем к ресурсу. |
| `ТаймаутЗапуска()` | Возвращает текущее значение таймаута запуска сервиса. |
| `УстановитьТаймаутЗапуска(<Таймаут>)` | Устанавливает максимальное время ожидания запуска сервиса. Применяется при синхронном запуске. |
| `РасположениеКонтроллеров()` | Возвращает текущий путь к файлу или каталогу с кастомными контроллерами. |
| `УстановитьРасположениеКонтроллеров(<Расположение>)` | Устанавливает путь к файлу или каталогу с кастомными контроллерами, определяющими точки маршрута сервиса. |
Сервис поддерживает подключение пользовательских контроллеров.
Контроллер - это класс OneScript с аннотацией `&Контроллер`.
В классе определяются точки маршрута (эндпоинты) аннотацией `&ТочкаМаршрута`.
Подробнее см. в документации [WINOW](https://github.com/autumn-library/winow).
**Пример контроллера**
``` bsl
&Контроллер("/order")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
&ТочкаМаршрута("add")
Процедура Главная(Ответ) Экспорт
// Бизнес-логика
КонецПроцедуры
```
### Подключение контроллеров
**Через API**
``` bsl
HttpBin = Новый HttpBin()
.УстановитьРасположениеКонтроллеров("./path/to/routes")
.Запустить();
```
**Через CLI**
``` bash
httpbin run --routes './path/to/routes'
```
- **Отсутствие поддержки HTTPS**: Сервис работает только по протоколу HTTP.
| Эндпоинт | oscript-httpbin | httpbin.org |
| --- | :-: | :-: |
| `/ip` | ✅ | ✅ |
| `/uuid` | ✅ | ✅ |
| `/uuid/:n` | ✅ | ❌ |
| `/user-agent` | ✅ | ✅ |
| `/headers` | ✅ | ✅ |
| `/get` | ✅ | ✅ |
| `/post` | ✅ | ✅ |
| `/put` | ✅ | ✅ |
| `/patch` | ✅ | ✅ |
| `/delete` | ✅ | ✅ |
| `/anything` | ✅ | ✅ |
| `/anything/:anything` | ✅ | ✅ |
| `/base64/:value` | ✅ | ✅ |
| `/encoding/utf8` | ✅ | ✅ |
| `/gzip` | ✅ | ✅ |
| `/deflate` | ✅ | ✅ |
| `/brotli` | ✅ | ✅ |
| `/zstd` | ✅ | ❌ |
| `/status/:code` | ✅ | ✅ |
| `/response-headers?key=val` | ✅ | ✅ |
| `/redirect/:n` | ✅ | ✅ |
| `/redirect-to?url=foo` | ✅ | ✅ |
| `/redirect-to?url=foo&status_code=307` | ✅ | ✅ |
| `/relative-redirect/:n` | ✅ | ✅ |
| `/absolute-redirect/:n` | ✅ | ✅ |
| `/cookies` | ✅ | ✅ |
| `/cookies/set?name=value` | ✅ | ✅ |
| `/cookies/set/:name/:value` | ✅ | ✅ |
| `/cookies/delete?name` | ✅ | ✅ |
| `/basic-auth/:user/:passwd` | ✅ | ✅ |
| `/hidden-basic-auth/:user/:passwd` | ✅ | ✅ |
| `/digest-auth/:qop/:user/:passwd/:algorithm` | ❌ | ✅ |
| `/digest-auth/:qop/:user/:passwd` | ❌ | ✅ |
| `/bearer` | ✅ | ✅ |
| `/stream/:n` | ❌ | ✅ |
| `/delay/:n` | ✅ | ✅ |
| `/drip?numbytes=n&duration=s&delay=s&code=code` | ❌ | ✅ |
| `/range/:n?duration=s&chunk_size=code` | ❌ | ✅ |
| `/html` | ✅ | ✅ |
| `/robots.txt` | ✅ | ✅ |
| `/deny` | ✅ | ✅ |
| `/cache` | ✅ | ✅ |
| `/cache/:n` | ✅ | ✅ |
| `/etag/:etag` | ✅ | ✅ |
| `/bytes/:n` | ✅ | ✅ |
| `/stream-bytes/:n` | ❌ | ✅ |
| `/links/:n` | ✅ | ✅ |
| `/links/:n/:offset` | ✅ | ✅ |
| `/image` | ✅ | ✅ |
| `/image/png` | ✅ | ✅ |
| `/image/jpeg` | ✅ | ✅ |
| `/image/webp` | ✅ | ✅ |
| `/image/svg` | ✅ | ✅ |
| `/forms/post` | ✅ | ✅ |
| `/xml` | ✅ | ✅ |
| `/json` | ✅ | ✅ |