Salta ai contenuti
ArenileArenile
Coste360.itCoste360.it

ETag e If-Match

Due persone modificano la stessa risorsa nello stesso momento: chi salva per secondo non deve cancellare senza saperlo il lavoro del primo. Arenile usa la concorrenza ottimistica: ogni risorsa versionata ha un numero di versione, esposto come ETag.

  1. Leggi la risorsa: la risposta ha l’header ETag: "3" (e il campo version).

    Finestra del terminale
    curl -i -b cookies.txt https://prenota.mio-lido.it/api/admin/v1/establishments/$ES/online-settings
    # ETag: "3"
  2. Modifica inviando la versione letta in If-Match:

    Finestra del terminale
    curl -X PUT -b cookies.txt -H "X-CSRF-Token: $CSRF" \
    -H 'If-Match: "3"' -H 'Content-Type: application/json' \
    -d @impostazioni.json \
    https://prenota.mio-lido.it/api/admin/v1/establishments/$ES/online-settings
  3. Se nel frattempo qualcuno ha salvato la versione 4, la risposta è 412 version_conflict con current_version: 4: rileggi, applica di nuovo le tue modifiche e riprova.

Risorsa If-Match
Impostazioni dello stabilimento, pagina pubblica, pagamenti, email facoltativo ma consigliato
Configurazione (stagioni, zone, pool, catalogo, regole, policy…) facoltativo ma consigliato
Mappe (PUT /maps/{id}) obbligatorio: senza, 428 precondition_required
Modifiche di una prenotazione facoltativo; il pannello lo usa sempre

Forme accettate: "3", la forma debole W/"3" (prodotta dai proxy che comprimono le risposte) e * (qualsiasi versione: sovrascrive consapevolmente).

Il profilo pubblico dello stabilimento (GET /api/public/v1/{slug}) ha un ETag calcolato sul contenuto: inviando If-None-Match con l’ultimo valore ricevuto, la risposta è 304 Not Modified senza corpo. La pagina di prenotazione lo usa per caricarsi più in fretta.