Вышел Form API

Вышел Form API

Первый стабильный релиз

Это немного запоздалая статья, но всё-таки мне хочется зафиксировать на бумаге проделанную работу, прежде чем двигаться дальше. О причине появления сервиса можно почитать здесь.

Что сделано

Суть микросервиса - предоставлять схему HTML-форм и принимать данные этих форм на хранение. Я не стал изобретать свой велосипед для описания схемы формы, а взял для этих целей XML, максимально приближенный к описанию формы на HTML5.

Вот пример форм, которые используются для демонстрации сервиса на промо-странице:

<form lang="ru" title="GitHub демо"
      action="https://kamilsk.github.io/form-api/"
      method="post" enctype="application/x-www-form-urlencoded">
    <input name="name" type="text" title="Имя"
           placeholder="Имя..." maxlength="25" required="1"/>
    <input name="feedback" type="text" title="Комментарий"
           placeholder="Ваш комментарий..." maxlength="255" required="1"/>
</form>

Принцип простоты возведен в абсолют, и для локализации форм я не стал использовать i18n, а предлагаю создавать для каждого языка свою схему.

<form lang="en" title="Email subscription"
      action="https://kamilsk.github.io/form-api/"
      method="post" enctype="application/x-www-form-urlencoded">
  <input name="email" type="email" title="Email"
         maxlength="64" required="1"/>
</form>

Ещё я думаю над иммутабельностью схемы, так как источников данных может быть много и их актуализация - не задача данного сервиса, а при изменении схемы старые данные могут перестать проходить проверку на соответствие.

Быстрый старт

Локальная сборка

$ egg github.com/kamilsk/form-api@^1.0.0 -- make up demo status

       Name                     Command               State                                  Ports
---------------------------------------------------------------------------------------------------------
form-api_db_1        docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
form-api_server_1    /bin/sh -c envsubst '$SERV ...   Up      80/tcp, 0.0.0.0:80->8080/tcp
form-api_service_1   form-api run --with-profil ...   Up      0.0.0.0:8080->80/tcp, 0.0.0.0:8090->8090/tc
$

Используя готовый Docker-образ

$ docker network create -d bridge form-api
$ docker run --rm -d \
             --env-file .env \
             --network form-api \
             --name form-api-db \
             -h db \
             -p 5432:5432 \
             postgres:10-alpine
$ docker run --rm -it \
             --env-file .env \
             --network form-api \
             --name form-api-migration \
             --link form-api-db:db \
             -h migration \
             kamilsk/form-api:latest migrate up --with-demo
$ docker run --rm -d \
             --env-file .env \
             --network form-api \
             --name form-api-service \
             --link form-api-db:db \
             -h service \
             -p 8080:8080 \
             kamilsk/form-api:latest
$ docker ps -f name=form-api

IMAGE                     COMMAND                  PORTS                       NAMES
kamilsk/form-api:latest   "form-api run"           0.0.0.0:8080->80/tcp, ...   form-api-service
postgres:10-alpine        "docker-entrypoint.s…"   0.0.0.0:5432->5432/tcp      form-api-db

API

$ curl http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
# <form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" lang="en" title="Email subscription"
#       action="http://localhost/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post"
#       enctype="application/x-www-form-urlencoded">
#       <input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email" name="email" type="email" title="Email"
#              maxlength="64" required="true"></input>
# </form>
$ curl -v -H "Content-Type: application/x-www-form-urlencoded" \
       --data-urlencode "email=test@my.email" \
       http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
# > POST /api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4 HTTP/1.1
# > Host: localhost:8080
# > User-Agent: curl/7.54.0
# > Accept: */*
# > Content-Type: application/x-www-form-urlencoded
# > Content-Length: 21
# >
# < HTTP/1.1 302 Found
# < Location: https://kamil.samigullin.info/?41ca5e09-3ce2-4094-b108-3ecc257c6fa4=success
# < Date: Sat, 05 May 2018 09:34:47 GMT
# < Content-Length: 0
# <
$

Теги

go form-api

Автор

Камиль Самигуллин
Камиль Самигуллин

Разработчик

Работая над Hugs Platform для сайта ManageWP, я создаю экосистему из микросервисов, объединённых одной целью - Make Static Sites Great Again! Одним из таких микросервисов является Form API, исходный код которого выложен мною в открытый доступ.

Спонсоры

Опубликовано

22.03.2018