Formatter
/api/v1

Dokumentacja API

Jedno żądanie POST formatuje plik. Bez klucza, bez konta, bez podpisu — cały kontrakt to adres i treść żądania.

Szybki start

Zminifikuj arkusz stylów i wypisz wynik:

curl
curl --data-urlencode 'input=.card { padding: 8px; margin: 0 auto; }' \
  https://formatter.nextwell.top/api/v1/minify/css/raw
# .card{padding:8px;margin:0 auto}

Zamień {css} na {js} albo {html}, a {minify} na {beautify} — działa każda kombinacja.

Endpointy

Adres bazowy to {base}. Wszystko poniżej to POST, o ile nie napisano inaczej.

Metoda Ścieżka Przeznaczenie
POST/api/v1/minify/{lang}Minifikacja, odpowiedź JSON
POST/api/v1/minify/{lang}/rawMinifikacja, odpowiedź zwykłym tekstem
POST/api/v1/beautify/{lang}Formatowanie, odpowiedź JSON
POST/api/v1/beautify/{lang}/rawFormatowanie, odpowiedź zwykłym tekstem
GET/api/v1/limitsIle zostało temu adresowi IP, bez zużywania żądania
GET/api/v1/healthSprawdzenie działania, nigdy nie limitowane

{lang} to css, js albo html.

Wysyłanie kodu

Każdy endpoint przyjmuje treść w trzech postaciach — wybierz tę, którą łatwiej złożyć twojemu klientowi.

Formularz urlencoded

Pole {input}, {type}. Taką postać przyjmują zwyczajowo API minifikacji, więc istniejący skrypt zmienia tylko adres.

curl
curl --data-urlencode 'input=body{margin:0;padding:0}' \
  https://formatter.nextwell.top/api/v1/beautify/css

JSON

{type} z łańcuchem znaków w polu {input}.

curl
curl -H 'Content-Type: application/json' \
  -d '{"input":"const a=1;const b=a+1;console.log(b)"}' \
  https://formatter.nextwell.top/api/v1/beautify/js

Surowa treść

Dowolny inny content type: treścią jest sam kod. Wygodne przy {example}.

curl
curl --data-binary @style.css \
  -H 'Content-Type: text/css' \
  https://formatter.nextwell.top/api/v1/minify/css

Rozmiar

2 MB na żądanie. Wszystko większe wraca jako 413 i nie jest nawet czytane.

Parametry zapytania

Nazwa Wartości Opis
engine auto upstream local Który silnik obsłuży to żądanie. {auto} — wartość domyślna — wysyła minifikację CSS i JS do serwisu zewnętrznego, dopóki starcza wspólnego budżetu, a potem przechodzi na silnik lokalny. {upstream} nie przechodzi, tylko zwraca błąd. {local} nigdy nie opuszcza serwera.
indent 2 4 tab Tylko przy formatowaniu: czym jest jeden poziom wcięcia.
curl
curl --data-urlencode 'input=.a{color:red}' \
  'https://formatter.nextwell.top/api/v1/beautify/css?indent=tab&engine=local'

Odpowiedź

Udane wywołanie zwraca JSON:

JSON
{
  "ok": true,
  "action": "minify",
  "language": "css",
  "engine": "upstream",
  "input_bytes": 1024,
  "output_bytes": 640,
  "saved_bytes": 384,
  "saved_percent": 37.5,
  "duration_ms": 42,
  "output": "p{color:red}"
}
Pole Typ Opis
okbooleanPrzy powodzeniu zawsze true.
actionstringminify albo beautify — o co poproszono.
languagestringcss, js albo html.
enginestringupstream, jeśli obsłużyła to usługa zewnętrzna, local — jeśli ten serwer.
input_bytesnumberRozmiar tego, co wysłano, w bajtach.
output_bytesnumberRozmiar wyniku, w bajtach.
saved_bytesnumberRóżnica; przy formatowaniu ujemna.
saved_percentnumberTa sama różnica w procentach, z jednym miejscem po przecinku.
duration_msnumberIle trwała praca, w milisekundach.
outputstringPrzetworzony kod.

Odpowiedzi zwykłym tekstem

Dopisz {raw} do dowolnego endpointu formatowania, a treścią odpowiedzi będzie wyłącznie wynik, jako {type}. Nagłówki są te same. Przydatne, gdy wywołanie idzie z powłoki:

curl
curl -s --data-binary @app.js \
  -H 'Content-Type: text/javascript' \
  https://formatter.nextwell.top/api/v1/minify/js/raw > app.min.js

Nagłówki odpowiedzi

Nagłówek Opis
X-Formatter-EngineKtóry silnik wytworzył wynik.
X-Formatter-DurationCzas przetwarzania w milisekundach.
X-RateLimit-Remaining-Second-MonthIle zostało w każdym oknie dla tego adresu IP.
Retry-AfterPrzy 429: sekundy do otwarcia najciaśniejszego wyczerpanego okna.
curl
curl -s -D - -o /dev/null --data-urlencode 'input=.a{color:red}' \
  https://formatter.nextwell.top/api/v1/minify/css

Błędy

Każdy błąd to JSON w postaci przyjętej dla tego rodzaju API, więc klient, który obsługuje już taką postać, obsłuży i nasze błędy:

JSON
{
  "errors": [
    { "status": 429, "title": "Too many requests", "detail": "…" }
  ]
}
Kod Pole title Kiedy
400Missing input Bad requestBrak treści albo puste pole input.
404Not foundNie ma takiej ścieżki.
405Method not allowedDo endpointu formatowania trafiło coś innego niż POST.
413Payload too largeTreść przekracza 2 MB.
415Unsupported languageJęzyk w ścieżce to nie css, js ani html.
422Malformed inputNarzędzie formatujące odrzuciło źródło — zwykle to błąd składni.
429Too many requestsJedno z okien limitu jest wyczerpane. Sprawdź Retry-After.
502Upstream failedTylko przy engine=upstream: usługa zewnętrzna nie odpowiedziała. Bez tego wymuszenia żądanie trafiłoby do silnika lokalnego.
500Internal errorWszystko inne.

Limity żądań

Na adres IP, pięć okien przesuwnych, wszystkie egzekwowane naraz. Żądanie musi zmieścić się we wszystkich pięciu.

Okno Limit
Na sekund꯹dań: {n}
Na minut꯹dań: {n}
Na godzin꯹dań: {n}
Na dob꯹dań: {n}
Na miesiącŻądań: {n}

Gdy okno jest wyczerpane, wraca 429 z nagłówkiem Retry-After podającym sekundy do otwarcia najciaśniejszego z nich. Nic nie jest kolejkowane.

Liczniki leżą w małej bazie na dysku, więc restart usługi nikomu nie daje nowej doby.

{endpoint} pokazuje bieżący stan wszystkich pięciu okien, nie zużywając żadnego z nich.

curl
curl https://formatter.nextwell.top/api/v1/limits

Zewnętrzna usługa minifikacji pozwala na 30 żądań na minutę dla całej witryny, a nie dla pojedynczego odwiedzającego. Pilnuje tego wspólny kubełek: gdy jest pusty, minifikację CSS i JS wykonuje silnik lokalny, zamiast czekać albo zwracać błąd. Pod obciążeniem pole engine może się zmieniać — wynik w obu przypadkach pozostaje poprawny.

Który silnik wykonuje pracę

Dwie drogi, jeden kontrakt.

W chmurze — minifikacja CSS i JS

Zewnętrzna usługa minifikacji, szybka i ostrożna: usuwa te białe znaki, które można usunąć, i zachowuje te, których nie można, więc konstrukcje w rodzaju {calc} pozostają nienaruszone. Ta usługa tylko przepuszcza przez nią kod i nie dodaje nic od siebie.

Lokalny — cała reszta

Minifikacja HTML, wszystkie trzy formatery oraz minifikacja CSS/JS, gdy wspólny budżet usługi zewnętrznej się skończy albo usługa ma działać bez wywołań na zewnątrz. Zbudowany na {tools}, ładowanych dopiero wtedy, gdy potrzebuje ich żądanie — bezczynny proces pozostaje mały.

Ustaw {param}, aby przypiąć żądanie do jednej z dróg.

Co jest przechowywane

Nic. Kod trzymany jest w pamięci przez czas trwania żądania i znika. Nie jest zapisywany na dysk i nigdy nie pojawia się w logach. Co logi rzeczywiście niosą: skrócony hash adresu IP, język, akcję, liczbę bajtów, silnik i czas trwania.

Pytania

Czy potrzebuję klucza?

Nie. Usługa jest otwarta, a limity liczone są po adresie IP.

Czy mój kod jest gdzieś wysyłany?

Minifikacja CSS i JavaScript jest proxowana do zewnętrznej usługi minifikacji, więc ten kod opuszcza ten serwer. Formatowanie i cała praca z HTML odbywa się tutaj. Ustaw engine=local, aby wszystko zostało na tym serwerze.

Czy mogę użyć tego w skrypcie budowania?

Tak, po to są endpointy /raw. Trzymaj się limitów i pamiętaj, że pod obciążeniem silnik może przejść na lokalny.

Dlaczego w zminifikowanym kodzie JavaScript zmieniły się nazwy?

Zewnętrzny minifikator skraca nazwy zmiennych lokalnych — to bezpieczne i stąd bierze się większość oszczędności. Formatowanie nie przywróci oryginalnych nazw: nie przywróci ich już nic.

Jaki największy plik mogę wysłać?

2 MB w jednym żądaniu. Większe pliki są odrzucane z 413, a nie obcinane.