Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku punktów końcowych REST deweloperzy często chcą kontrolować, czy aktualizacje tworzą nowe rekordy, czy modyfikują tylko istniejące. Nagłówek HTTP udostępnia kontrolkę w narzędziu If-Match Data API Builder (DAB).
Domyślnie daB traktuje operacje PUT upsert i PATCH jako operacje upsert :
Jeśli zasób istnieje: jest aktualizowany.
Jeśli nie istnieje: jest wstawiony.
-
PUT→ pełnej operacji upsert (zastępuje zasób). -
PATCH→ przyrostowe upsert (stosuje częściową aktualizację).
-
Dodawanie If-Match: * zmian tego zachowania do semantyki tylko aktualizacji.
Co If-Match robi w języku DAB
If-Match jest obsługiwany tylko w przypadku wartości *wieloznacznych .
| Wartość nagłówka | Zachowanie |
|---|---|
If-Match: * |
Przeprowadź aktualizację tylko wtedy, gdy zasób istnieje; jeśli brakuje → 404 Nie znaleziono. |
If-Match: <any other> |
Odrzucone; 400 Nieprawidłowe żądanie (Etags not supported, use '*'). |
| (nieobecny) | Zachowanie operacji upsert (wstaw, jeśli nie znaleziono, w przeciwnym razie zaktualizuj). |
Omówienie zachowania
- Język DAB nie implementuje elementu ETag dla rekordu ani dopasowania wersji.
- Nie ocenia się tokenu współbieżności.
*tylko asercyjnie "musi istnieć". - Dotyczy tylko rest, a nie GraphQL.
- Obecnie nie ma znaczenia dla operacji DELETE.
Używanie If-Match z funkcją PUT
Bez If-Matchmetody funkcja PUT wstawia, gdy zasób nie istnieje (zwraca wartość 201 Created).
Przykład tylko do aktualizacji
Żądanie
PUT /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Return of the King"
}
Powodzenie (rekord istniał)
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Return of the King"
}
Błąd (brak rekordu)
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Przykład wstawiania upsert (nie If-Match i rekord nie istnieje)
Żądanie
PUT /api/Books/id/500
Content-Type: application/json
{
"title": "Inserted via PUT",
"publisher_id": 7
}
Odpowiedź
HTTP/1.1 201 Created
Location: id/500
Content-Type: application/json
{
"id": 500,
"title": "Inserted via PUT",
"publisher_id": 7
}
Używanie If-Match z poprawką PATCH
PATCH zachowuje się podobnie. Bez If-Matchparametru wykonuje przyrostowe operacje upsert. W programie If-Match: *aktualizuje tylko istniejące wiersze.
Żądanie
PATCH /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Two Towers"
}
Odpowiedź w przypadku powodzenia
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Two Towers"
}
Odpowiedź, gdy nie znaleziono
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Nieprawidłowe użycie If-Match
Każda wartość inna niż * (w tym ciągi cytowane) jest odrzucana.
Żądanie
PUT /api/Books/id/1
If-Match: "abc123"
Content-Type: application/json
{
"title": "To Kill a Mockingbird"
}
Odpowiedź
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "Etags not supported, use '*'"
}
Wykonaj przegląd
- Pomijanie
If-Matchsemantyki operacji upsert (insert-or-update). - Służy
If-Match: *do ścisłej semantyki tylko aktualizacji (404, jeśli brakuje elementu). - Nie używaj żadnej innej wartości. Dopasowanie rzeczywistego elementu ETag nie jest implementowane.