I lettori che non conoscono questo argomento saranno colpiti dalla discussione infinita su cosa dovresti fare e dalla relativa assenza di lezioni dall'esperienza. Il fatto che il REST sia "preferito" rispetto al SOAP è, suppongo, un apprendimento di alto livello dall'esperienza, ma per fortuna dobbiamo essere progrediti da lì? È il 2016. La tesi di dottorato di Roy è stata nel 2000. Cosa abbiamo sviluppato? Era divertente? È stato facile integrarsi con? Supportare? Gestirà l'ascesa di smartphone e connessioni mobili traballanti?
Secondo ME, le reti della vita reale non sono affidabili. Timeout delle richieste. Le connessioni vengono ripristinate. Le reti si interrompono per ore o giorni alla volta. I treni entrano nei tunnel con gli utenti mobili a bordo. Per ogni data richiesta (come occasionalmente riconosciuto in tutta questa discussione) la richiesta può cadere nell'acqua sulla sua strada, oppure la risposta può cadere nell'acqua sulla via del ritorno. In queste condizioni, l'invio di richieste PUT, POST e DELETE direttamente contro risorse sostanziali mi ha sempre sembrato un po 'brutale e ingenuo.
HTTP non fa nulla per garantire il completamento affidabile della richiesta-risposta, e va bene perché questo è correttamente il lavoro delle applicazioni sensibili alla rete. Sviluppando una tale applicazione, puoi saltare attraverso i cerchi per usare PUT invece di POST, quindi più cerchi per dare un certo tipo di errore sul server se rilevi richieste duplicate. Di nuovo al cliente, devi saltare attraverso i cerchi per interpretare questi errori, recuperare, riconvalidare e ripubblicare.
Oppure puoi farlo : considera le tue richieste non sicure come risorse effimere per singolo utente (chiamiamole azioni). I clienti richiedono una nuova "azione" su una risorsa sostanziale con un POST vuoto alla risorsa. POST verrà utilizzato solo per questo. Una volta in modo sicuro in possesso dell'URI dell'azione appena coniata, il client METTE la richiesta non sicura all'URI dell'azione, non la risorsa di destinazione . Risolvere l'azione e aggiornare la risorsa "reale" è correttamente il lavoro dell'API ed è qui disaccoppiato dalla rete inaffidabile.
Il server svolge l'attività, restituisce la risposta e la memorizza rispetto all'URI dell'azione concordato . Se qualcosa va storto, il client ripete la richiesta (comportamento naturale!) E se il server l'ha già vista, ripete la risposta memorizzata e non fa nient'altro .
Individuerai rapidamente la somiglianza con le promesse: creiamo e restituiamo il segnaposto per il risultato prima di fare qualsiasi cosa. Anche come una promessa, un'azione può avere successo o fallire una volta, ma il suo risultato può essere recuperato ripetutamente.
Soprattutto, diamo la possibilità di inviare e ricevere applicazioni per collegare l'azione identificata in modo univoco all'unicità nei rispettivi ambienti. E possiamo iniziare a chiedere e far rispettare! Comportamento responsabile dei clienti: ripeti le tue richieste quanto vuoi, ma non andare a generare una nuova azione finché non sei in possesso di un risultato definitivo da quello esistente.
Pertanto, numerosi problemi spinosi scompaiono. Le richieste di inserimento ripetute non creano duplicati e non creiamo la vera risorsa finché non siamo in possesso dei dati. (le colonne del database possono rimanere non annullabili). Le richieste di aggiornamento ripetute non colpiranno stati incompatibili e non sovrascriveranno le modifiche successive. I clienti possono (ri) recuperare ed elaborare senza problemi la conferma originale per qualsiasi motivo (client bloccato, risposta mancante, ecc.).
Le richieste di eliminazione successive possono visualizzare ed elaborare la conferma originale, senza colpire un errore 404. Se le cose impiegano più tempo del previsto, possiamo rispondere in via provvisoria e abbiamo un posto dove il cliente può ricontrollare per il risultato definitivo. La parte più bella di questo modello è la sua proprietà Kung-Fu (Panda). Prendiamo un punto debole, la propensione per i clienti a ripetere una richiesta ogni volta che non capiscono la risposta e la trasformiamo in un punto di forza :-)
Prima di dirmi che questo non è RESTful, ti preghiamo di considerare i numerosi modi in cui i principi REST sono rispettati. I clienti non costruiscono URL. L'API rimane rilevabile, sebbene con un piccolo cambiamento nella semantica. I verbi HTTP sono usati in modo appropriato. Se pensi che questo sia un cambiamento enorme da implementare, posso dirti per esperienza che non lo è.
Se pensi di avere enormi quantità di dati da archiviare, parliamo di volumi: una tipica conferma di aggiornamento è una frazione di un kilobyte. HTTP ti dà attualmente un minuto o due per rispondere in modo definitivo. Anche se memorizzi azioni solo per una settimana, i clienti hanno ampie possibilità di recuperare. Se si dispone di volumi molto elevati, è possibile che si desideri un archivio valori chiave dedicato conforme agli acidi o una soluzione in memoria.