La risposta breve e diretta
Poiché la richiesta parla dell'esecuzione dell'elenco di attività (le attività sono la risorsa di cui stiamo parlando qui), quindi se il gruppo di attività è stato spostato in avanti per l'esecuzione (cioè, indipendentemente del risultato dell'esecuzione), allora sarebbe ragionevole che lo stato della risposta sia 200 OK
. Altrimenti, se ci fosse un problema che impedisse l'esecuzione del gruppo di task, come la mancata validazione degli oggetti task , o qualche servizio richiesto non è disponibile per esempio, allora lo stato della risposta dovrebbe denotare che errore. Passato, quando l'esecuzione delle attività inizia, visto che le attività da eseguire sono elencate nel corpo della richiesta, allora mi aspetto che i risultati dell'esecuzione vengano elencati nel corpo della risposta.
La lunga risposta filosofica
Stai riscontrando questo dilemma perché stai deviando da ciò per cui è stato progettato HTTP. Non lo stai interagendo per gestire le risorse, piuttosto lo stai utilizzando come metodo di chiamata a metodi remota (che non è molto strano, tuttavia funziona male senza uno schema preconcetto).
Con quanto detto sopra, e senza il coraggio di trasformare questa risposta in una guida a lungo termine, il seguente è uno schema URI che si conforma a un approccio di gestione delle risorse:
-
%codice%
-
/tasks
elenca tutte le attività, paginate
-
GET
aggiunge una singola attività
-
%codice%
-
POST
risponde con l'oggetto stato di una singola attività
-
/tasks/task/[id]
annulla / cancella un'attività
-
%codice%
-
GET
elenca tutti i gruppi di attività, impaginati
-
DELETE
aggiunge un gruppo di attività
-
%codice%
-
/tasks/groups
risponde con lo stato di un gruppo di attività
-
GET
annulla / elimina il gruppo di attività
Questa struttura parla di risorse, non di cosa fare con loro. Ciò che viene fatto con le risorse è la preoccupazione di un altro servizio.
Un altro punto importante da fare è che è consigliabile non bloccare per molto tempo un gestore di richieste HTTP. Molto simile all'interfaccia utente, un'interfaccia HTTP dovrebbe essere reattiva, in un intervallo di tempo inferiore di alcuni ordini di grandezza (perché questo strato si occupa dell'IO).
Il passaggio alla progettazione di un'interfaccia HTTP che gestisca rigorosamente le risorse è probabilmente difficile quanto spostare il lavoro da un thread dell'interfaccia utente quando si fa clic su un pulsante. Richiede che il server HTTP comunichi con altri servizi per eseguire attività anziché eseguirle nel gestore richieste. Questa non è un'implementazione superficiale, è un cambio di direzione.
Alcuni esempi di come tale schema URI sarebbe usato
Esecuzione di una singola attività e avanzamento del monitoraggio:
-
POST
con l'attività da eseguire
-
/tasks/groups/group/[id]
fino a quando l'oggetto di risposta GET
ha un valore positivo mentre mostra lo stato corrente / progresso
Esecuzione di una singola attività e in attesa del suo completamento:
-
DELETE
con l'attività da eseguire
-
POST /tasks
fino a GET /tasks/task/[id]
ha un valore positivo (probabilmente ha un timeout, motivo per cui questo dovrebbe essere ripetuto in loop)
Esecuzione di un gruppo di task e avanzamento del monitoraggio:
-
completed
con il gruppo di attività da eseguire
-
POST /tasks
fino a quando l'oggetto risposta GET /tasks/task/[id]?awaitCompletion=true
ha valore, mostrando lo stato di un singolo compito (3 attività completate su 5, ad esempio)
Richiesta di esecuzione per un gruppo di attività e in attesa del suo completamento:
-
completed
con il gruppo di attività da eseguire
-
POST /tasks/groups
fino a quando risponde con un risultato che denota completamento (probabilmente ha un timeout, motivo per cui dovrebbe essere ripetuto)