Jak zbudowane są odpowiedzi z błędami w API LinkHarbor, co oznaczają najważniejsze kody błędów i jak Twój kod powinien na nie reagować.
Każda odpowiedź API z błędem ma ten sam format. Twój kod powinien polegać na kodzie błędu w polu error, a nie na tekście w message – kod pozostaje stały, a tekst może się zmienić i jest tłumaczony na język konta.
Budowa odpowiedzi z błędem
{
"error": "validation_failed",
"message": "Some of the information provided is invalid. Please check and try again.",
"details": [
{ "field": "title", "reason": "minLength", "message": "…" }
],
"request_id": "6b1f0c2e-…"
} - error
- Kod czytelny maszynowo, na przykład not_found. Przy większości błędów jest też w nagłówku X-Error-Code – ale polegaj na polu w treści odpowiedzi.
- message
- Opis czytelny dla człowieka w języku konta: przy kluczu API w języku właściciela workspace, przy połączonej aplikacji w języku osoby, która ją połączyła. Bez ważnego tokenu – na przykład przy 401 z kontroli tokenu – język zależy od Accept-Language, a w przeciwnym razie jest to angielski. Nagłówek Content-Language podaje język.
- details
- Pojawia się tylko wtedy, gdy jest coś więcej do przekazania. Przy 422 z walidacji danych wejściowych to lista z field, reason i message dla każdego problemu; przy 422 z logiki biznesowej i wszystkich innych błędach to obiekt, na przykład z reason, retry_after_sec lub listą issues. Przy przekroczeniu rozmiaru zawiera field, reason i limit, a przy 413 request_too_large max_bytes i max_kb. Sprawdzaj więc, czy details jest listą.
- request_id
- ID żądania. Jest też w nagłówku X-Request-Id. Podaj je, gdy kontaktujesz się z pomocą techniczną.
Wyjątki: odpowiedź 429 rate_limited ma pole retry_after_sec zamiast details; przy 429 i 403 insufficient_scope w treści brakuje request_id. 401 z kontroli tokenu i 422 z kontroli schematu nie mają nagłówka X-Error-Code, a przy kontroli schematu tłumaczony jest tylko message najwyższego poziomu; teksty w details pozostają po angielsku. Nagłówek X-Request-Id jest ustawiany zawsze.
Najważniejsze kody
| HTTP | error | Znaczenie | Co zrobić |
|---|---|---|---|
| 400 | invalid_json | Treść nie jest poprawnym JSON-em | Sprawdź JSON |
| 400 | bad_request | Błędny Content-Type lub nieprawidłowo zbudowane żądanie | Ustaw Content-Type: application/json |
| 401 | missing_bearer_token | Brak tokenu w nagłówku Authorization | Ustaw nagłówek Authorization: Bearer … |
| 401 | invalid_token | Token wygasł lub jest nieprawidłowy albo klucz został usunięty | Pobierz nowy token; jeśli to nie pomoże, sprawdź klucz |
| 401 | invalid_api_key | Błędne ID klucza lub sekret przy wymianie tokenu | Sprawdź dane dostępowe |
| 402 | plan_limit_reached | Osiągnięto limit planu, na przykład dla krótkich linków | Zmień plan na wyższy lub usuń wpisy |
| 403 | insufficient_scope | Brak zakresu lub endpoint niedostępny dla kluczy API | Utwórz klucz z właściwym zakresem |
| 403 | forbidden | Brak uprawnień do tej akcji | Wykonaj ją w panelu |
| 403 | feature_not_available | Funkcja nie jest zawarta w planie | Sprawdź plan |
| 403 | block_type_requires_plan | Typ bloku dostępny tylko w wyższym planie | Wybierz inny typ bloku lub zmień plan na wyższy |
| 403 | template_locked | Szablon premium niedostępny w obecnym planie | Wybierz szablon z GET /v1/templates/available |
| 403 | workspace_suspended, workspace_read_only, workspace_grace_expired | Workspace zablokowany lub tylko do odczytu z powodu zaległej płatności | Ureguluj płatność w panelu |
| 404 | not_found | Zasób nie istnieje lub nie należy do Twojego workspace | Sprawdź ID |
| 409 | conflict | Ogólny konflikt z bieżącym stanem | Wczytaj stan ponownie, zmień dane wejściowe |
| 409 | workspace_template_in_use | Szablon workspace jest nadal używany przez strony; ich liczba znajduje się w details.count | Przełącz strony na inny szablon, a potem go usuń |
| 409 | handle_taken, slug_taken | Handle lub slug krótkiego linku jest już zajęty | Wybierz inną wartość |
| 409 | form_in_use, page_not_private, page_not_published, never_published | Konflikt ze stanem: formularz nadal jest na stronie, strona nie jest prywatna lub nie jest opublikowana, strona nigdy nie była opublikowana | Zmień stan, a potem spróbuj ponownie |
| 409 | page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reached | Osiągnięto limit liczby lub miejsca w planie | Usuń wpisy lub zmień plan na wyższy |
| 409 | draft_not_publishable | Wersja robocza ma problemy; lista znajduje się w details.issues | Usuń problemy, a potem opublikuj ponownie |
| 413 | request_too_large | Treść większa niż dozwolona dla tego endpointu (64 KB, 1 MB lub 2 MB); limit znajduje się w details.max_kb | Wysyłaj mniej danych na żądanie, zobacz Limity zapytań |
| 413 | payload_too_large | Przesłany plik jest większy niż 10 MB | Zmniejsz plik |
| 422 | validation_failed | Nieprawidłowe dane wejściowe lub nieznane pole; szczegóły w details | Popraw pola zgodnie z details |
| 422 | handle_reserved, target_url_invalid, target_url_scheme, target_url_host | Handle zarezerwowany albo docelowy URL nieprawidłowy lub niedozwolony | Wybierz inną wartość |
| 422 | workspace_template_disabled | Wybrany szablon workspace jest wyłączony | Włącz szablon w sekcji „Domeny i szablony” lub wybierz inny |
| 422 | template_css_external, template_section_invalid | Szablon workspace: CSS wczytuje coś z zewnętrznych serwerów albo sekcja {{#if}}/{{#unless}}/{{#each}} jest umieszczona nieprawidłowo | Usuń zewnętrzne adresy albo zamknij sekcję w tym samym tagu lub tekście |
| 422 | custom_css_external | Własny CSS wczytuje coś z zewnętrznych serwerów | Usuń zewnętrzne adresy z CSS |
| 429 | rate_limited, api_key_locked | Za dużo żądań albo klucz zablokowany po nieudanych próbach | Odczekaj tyle, ile podaje Retry-After lub details.retry_after_sec |
| 500 | internal_error | Nieoczekiwany błąd | Spróbuj ponownie później, zanotuj request_id |
| 503 | service_unavailable | Usługa chwilowo niedostępna | Spróbuj ponownie po przerwie |
Odczytywanie błędów danych wejściowych
Przy 422 validation_failed details wymienia każdy problem osobno: field to ścieżka pola (z ukośnikami dla zagnieżdżonych obiektów, na przykład theme_config/button_style), reason to złamana reguła, taka jak required, minLength, maxLength, enum lub additionalProperties. Przy additionalProperties komunikat mówi, które pola są nieznane – często chodzi o literówkę w nazwie pola.
Zalecana obsługa w kodzie
- 400, 413 i 422: nie ponawiaj, tylko popraw żądanie
- 401 invalid_token: pobierz raz nowy token i ponów
- 403: nie ponawiaj; sprawdź zakres, plan lub to, kto może wykonać tę akcję
- 404: sprawdź ID; po usunięciu to normalne
- 409: wczytaj stan ponownie i zdecyduj, czy akcja jest nadal potrzebna
- 429: odczekaj tyle, ile podaje Retry-After, a potem ponów – zobacz Limity zapytań
- 500 i 503: ponów kilka razy z rosnącymi przerwami
Może Ci się też przydać
Nic nie znaleziono?
Napisz, czego potrzebujesz, a nasz zespół pomocy technicznej pomoże Ci osobiście.