An open API service indexing awesome lists of open source software.

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-запросов

Awesome Lists containing this project

README

          

# httpbin

[![Release](https://img.shields.io/github/release/Stivo182/oscript-httpbin.svg)](https://github.com/Stivo182/oscript-httpbin/releases)
[![Тестирование](https://github.com/stivo182/oscript-httpbin/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/stivo182/oscript-httpbin/actions/workflows/test.yml)
[![Статус порога качества](https://sonar.openbsl.ru/api/project_badges/measure?project=httpbin&metric=alert_status&token=sqb_2f7c84743fd1b295085c25a1b96cc8d975cd4dc7)](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
```

## Использование

### CLI

Запустите сервис с помощью команды:

``` 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.

## Сравнение с httpbin.org

| Эндпоинт | 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` | ✅ | ✅ |