Przejdź do głównej zawartości

Konwencje żądań: nagłówki kontekstu, błędy, lokalizacja

Każdy punkt końcowy /api/v1/* o zakresie organizacji korzysta z tego samego kontraktu żądań: tokenu Bearer, dwóch nagłówków kontekstu wybierających organizację i zespół, w których działasz, treści JSON (przesyłanie plików używa zamiast tego multipart lub tus), jednej struktury błędów i paginacji kursorowej w punktach końcowych zwracających listy. Ta strona opisuje ten kontrakt; strony poszczególnych domen zakładają jego znajomość.

Niemal wszystko w DUST API należy do organizacji, a w jej ramach do zespołu. Organizację i zespół, w których działa żądanie, wybierasz za pomocą dwóch nagłówków:

NagłówekWymaganyWartość
Dust-Ctx-Org-IdTak, w punktach końcowych o zakresie organizacjiUUID organizacji.
Dust-Ctx-Team-IdNieUUID zespołu. W przypadku pominięcia domyślnie używany jest zespół główny organizacji.
Okno terminala
curl -fsS "https://apid.dustid.io/api/v1/threads" \
-H "Authorization: Bearer $DUST_TOKEN" \
-H "Dust-Ctx-Org-Id: $DUST_ORG_ID" \
-H "Dust-Ctx-Team-Id: $DUST_TEAM_ID"

Szczegóły istotne w praktyce:

  • Wartości nagłówków muszą być identyfikatorami UUID; nieprawidłowa wartość jest odrzucana z kodem 400 INVALID_REQUEST, zanim punkt końcowy zostanie wykonany.
  • Warianty z prefiksem X- (X-Dust-Ctx-Org-Id, X-Dust-Ctx-Team-Id oraz starsza para) są akceptowane jako aliasy.
  • Punkty końcowe, które wymagają kontekstu, ale go nie otrzymują, kończą się błędem z kodem ORG_ID_REQUIRED lub TEAM_ID_REQUIRED.
  • Kilka punktów końcowych ma zakres użytkownika i nie wymaga kontekstu — najczęściej używanym jest GET /api/v1/me.

Autoryzacja jest oceniana dla twojego użytkownika działającego w zespole wskazanym w nagłówkach. To samo wywołanie z innym Dust-Ctx-Team-Id może zwrócić inne wyniki: to, co możesz wyświetlać, odczytywać i zapisywać, odpowiada temu, co widzi dany zespół — jego własnym danym oraz wszystkiemu, co mu udostępniono. Wysłanie kontekstu, do którego nie należysz, nie zwiększa żadnych uprawnień; żądania są sprawdzane względem twoich rzeczywistych członkostw. Operacje na plikach, folderach, relacjach, linkach rekordów, importach złożeń, formularzach certyfikatów, Fabric, wydzieleniach, listach połączonych zespołów, stronach publicznych, projektach stron publicznych, aktywności i katalogu użytkowników wymagają bieżącego członkostwa w wybranym zespole i weryfikują, czy należy on do wybranej organizacji — zarówno w przypadku osób, jak i kont usług. Historia rekordu wymaga ponadto uprawnienia do wyświetlenia tego rekordu; wybranie ID rekordu nie przyznaje dostępu. Tworzenie rekordów (w tym tworzenie zbiorcze) i szablonów również wymaga bieżącego członkostwa w wybranym zespole. Listy członkostw administratorów organizacji nie wykraczają poza wybraną organizację. Zobacz Zespoły i udostępnianie.

Opcjonalny nagłówek Dust-Ctx-Locale wybiera język tekstu generowanego przez serwer i przeznaczonego dla użytkownika — przede wszystkim ciągów message w błędach:

Dust-Ctx-Locale: zh-CN

Obsługiwane ustawienia regionalne to de, es, fr, it, ja, pl, pt, en (domyślne) i zh-CN. Gdy nagłówek nie jest obecny, serwer używa standardowego nagłówka Accept-Language, a następnie języka angielskiego. Kody błędów są stałymi identyfikatorami i nigdy nie są lokalizowane — rozgałęziaj logikę według code, a wyświetlaj message.

Nieudane żądania zwracają treść JSON o jednej, spójnej strukturze:

{
"code": "UNAUTHORIZED",
"message": "You are not authorized to perform this action",
"status": 401,
"detail": { }
}
PoleTypZnaczenie
codestringStały, czytelny maszynowo kod błędu. Na jego podstawie rozgałęziaj logikę.
messagestringOpis czytelny dla człowieka, zlokalizowany zgodnie z Dust-Ctx-Locale.
statusnumberOdpowiada kodowi stanu HTTP.
detailobject (opcjonalne)Dodatkowy kontekst błędu, np. szczegóły walidacji.

Kody, które napotkasz najwcześniej:

KodTypowy statusKiedy
INVALID_REQUEST400Nieprawidłowa treść, zapytanie lub nagłówek (szczegóły walidacji w detail).
UNAUTHORIZED401Brakujący, wygasły lub nieprawidłowy token Bearer.
FORBIDDEN403Uwierzytelniono, ale ten kontekst zespołu nie zezwala na tę operację.
NOT_FOUND / NO_DATA_FOUND404W tym kontekście nie jest widoczny żaden taki obiekt.
ORG_ID_REQUIRED / TEAM_ID_REQUIRED400Brak nagłówka kontekstu w punkcie końcowym z zakresem.
THREAD_DATA_CONFLICT409Konflikt współbieżności optymistycznej: twój widok rekordu był nieaktualny.

Każda odpowiedź zawiera też nagłówek x-request-id. Zapisuj go w logach i podawaj podczas kontaktu z pomocą techniczną — pozwala on dokładnie zlokalizować twoje żądanie w śladach serwera.

Błędy i wyniki skanowania to pełna dokumentacja: każdy kod, który możesz napotkać, wraz ze statusem, kanoniczne tabele wyników identyfikacji i weryfikacji, wskazówki dotyczące ponawiania oraz sposób zachowania raportu skanu, gdy operacja się nie powiedzie.

Punkty końcowe zwracające listy (rekordy, foldery, pliki, zdarzenia, szablony, …) używają paginacji kursorowej:

  • Żądanie: parametry zapytania pageSize (długość strony) i cursor (nieprzezroczysty ciąg z poprzedniej strony). pageSize musi być liczbą całkowitą od 1 do 1000; niektóre punkty końcowe narzucają mniejsze maksimum. Pomiń go, aby użyć wartości domyślnej punktu końcowego.
  • Punkty końcowe używające pageIndex akceptują liczby całkowite od 0 do 1 000 000. Ujemne lub ułamkowe wartości paginacji są odrzucane.
  • Odpowiedź: tablica elementów oraz opcjonalne ciągi kursorów next i prev. Brak next oznacza, że jesteś na ostatniej stronie.
Okno terminala
# First page
curl -fsS "https://apid.dustid.io/api/v1/threads?pageSize=50" \
-H "Authorization: Bearer $DUST_TOKEN" \
-H "Dust-Ctx-Org-Id: $DUST_ORG_ID"
# Follow the cursor
curl -fsS "https://apid.dustid.io/api/v1/threads?pageSize=50&cursor=$NEXT" \
-H "Authorization: Bearer $DUST_TOKEN" \
-H "Dust-Ctx-Org-Id: $DUST_ORG_ID"
{
"threads": [ ... ],
"next": "eyJjcmVhdGVkQXQiOi...",
"prev": "eyJjcmVhdGVkQXQiOi..."
}

Kursory są nieprzezroczyste — zapisuj je i odtwarzaj, ale nigdy ich nie analizuj. Punkty końcowe zwracające listy, które obsługują sortowanie, przyjmują order (asc/desc) oraz specyficzny dla punktu końcowego orderCol (dla rekordów: createdAt, updatedAt, name).

Każda operacja wymaga jednego z trzech poziomów uprawnień, a prefiks ścieżki wskazuje go, zanim przeczytasz choćby jeden schemat:

PrefiksKto może wywołaćUwagi
/api/v1/org/*Administratorzy organizacji — użytkownicy z rolą admin (lub owner) w organizacji wskazanej przez Dust-Ctx-Org-IdTworzenie zespołów, aktualizacje zespołów, członkostwa
/api/v1/connections/*Administratorzy zespołu — administratorzy działającego zespołu wskazanego przez Dust-Ctx-Team-IdCykl życia połączeń i zmiany kierunku
wszystkie pozostałeCzłonkowie kontekstu żądania, chyba że operacja stanowi inaczejStandardowy zakres funkcji

Każda operacja ma też w specyfikacji OpenAPI rozszerzenie x-required-role (member, publisher, team-admin lub org-admin) — traktuj je jako wiążącą zasadę dla danej operacji; operacja bez tej adnotacji wymaga roli member. publisher to uprawnienie nadawane w ramach członkostwa w zespole, a nie osobny poziom: jest wymagane, aby dane zespołu stały się publicznie dostępne do odczytu, a administratorzy zespołu zawsze je mają. Wywołanie operacji powyżej twojego poziomu zwraca 403 FORBIDDEN niezależnie od ładunku.

  • Żądania mają Content-Type: application/json, chyba że punkt końcowy wyraźnie przyjmuje dane formularza multipart (skany identyfikatorów w /api/v1/tags/*, przesyłanie plików).
  • ID to ciągi UUID zgodne z RFC 4122 (threadId, eventId, ID organizacji i zespołów, …). Traktuj je jako nieprzezroczyste.
  • Znaczniki czasu (createdAt, updatedAt, archivedAt, …) to ciągi znaczników czasu w UTC.
  • Zapisy są odnotowywane jako zdarzenia: modyfikacja rekordu dopisuje zdarzenie do jego historii zamiast niejawnie nadpisywać dane — odczyty takie jak GET /api/v1/threads/{thread_id} zwracają { thread, events }.