Scegli tra http 401 e 409 [duplicato]

12

Ho due API da seguire & smettere di seguire un utente.

domain/uid/follow    (http POST)       to follow user
domain/uid/follow    (http DELETE)     to unfollow user

Segue l'utente e risponde con il codice http 200. Quando l'utente prova a seguire di nuovo (utente già seguito) rispondo con 401.

Domande:

1 - Devo rispondere con 401 Non Autorizzato o 409 Conflict?

2 - Lo stesso per quando l'utente non sta seguendo qualcuno e cerca di smetterlo.

Modifica

Non utilizzo un'unica API per attivare il comportamento di follow/unfollow . Ho 2 API separate per entrambe le azioni.

Non ho alcun motivo particolare per rispondere con errore. Viene utilizzato solo il test automatico per le API per verificare che un utente non venga seguito due volte.

    
posta Shaharyar 21.07.2017 - 12:59
fonte

3 risposte

42

Tecnicamente, dipende dal metodo HTTP che usi. Ti suggerisco di usare PUT perché se lo fai, questa linea di argomenti funziona bene:

Se qualcuno vuole seguire un altro utente e già lo segue, non è così? Lo stesso vale per non seguire. Quindi restituisce sempre 200 .

Questo comportamento è chiamato idempotenza. Vedi questa spiegazione per maggiori informazioni.

Se vai per POST, tecnicamente dovresti creare una risorsa secondo le convenzioni HTTP. La creazione di una risorsa non è idempotente, quindi nemmeno la tua interfaccia potrebbe esserlo. Se segui questa convenzione, dovresti restituire lo stato 409 Conflict o 422 Unprocessable Entity su due richieste follow-unfollow. Affermare la ragione in modo più dettagliato in un corpo di risposta all'errore è una buona pratica; aiuta molto i tuoi utenti API.

Tuttavia, RFC 7231 (HTTP 1.1) non richiede all'utente di creare sempre una risorsa; un POST idempotente è quindi anche una soluzione valida.

Nota: 401 significa Unauthorized . Ciò significa che la richiesta non fornisce credenziali o le credenziali fornite sono non valide . Tuttavia, presumo di aver convalidato le credenziali prima ancora di tentare di seguire / seguire. Quindi, rispondere con 401 non ha assolutamente senso in quella situazione. 403 Forbidden è molto estrapolato e anche non molto applicabile (ma comunque migliore di 401).

    
risposta data 21.07.2017 - 13:02
fonte
18

Non tradurre gli errori di business in codici di stato HTTP. I codici di stato devono essere interpretati dal client HTTP, non dal tuo dominio o dall'utente stesso. Se vuoi comunicare un messaggio all'utente, fallo nel corpo della risposta

Creazione del follow-up 1

POST /domain/uid/follow HTTP/1.1
...
HTTP/1.1 201 Created
Date: Fri, 20 Dec 2017 14:30:00 GMT
Content-Type: application/json
Location: /domain/uid/follow/123456

Duplicazione del follow-up 2

POST /domain/uid/follow HTTP/1.1
...
HTTP/1.1 409 Conflict
Date: Fri, 20 Dec 2017 14:30:00 GMT
Content-Type: application/json
Content-Length: 100
{"message":"you are already following Shaharyar!"}

Per ulteriori informazioni sulla causa dell'errore, possiamo utilizzare intestazioni personalizzate.

MyApplication-error: AlreadyFollowingUserError

da Following

2 - Same for when the user is not following someone and tries to unfollow him.

Questo secondo caso è leggermente diverso. Se stiamo cercando di rimuovere una risorsa che non esiste

DELETE /domain/uid/follow HTTP/1.1
...
HTTP/1.1 404 Not Found
Date: Fri, 20 Dec 2017 14:30:00 GMT
Content-Type: application/json
Content-Length: 1000
MyApplication-error: ResourceNotFound
{"message":"resource not found"}

D'altra parte, come @K. Alan Bates ha commentato (grazie Alan), potremmo rendere l'operazione idempotente, non appena l'URI richiesto è ancora disponibile.

DELETE /domain/uid/follow HTTP/1.1
...
HTTP/1.1 204 No content
Date: Fri, 20 Dec 2017 14:30:00 GMT
Content-Type: application/json
Content-Length: 100

Ho scelto 204 per semplicità. Potrebbe essere 200 o 202.

In ogni caso, non dovremmo rispondere con 401 Unauthorized a meno che il servizio di sicurezza non dica altrimenti.

1: Modifica - Idealmente dopo una nuova creazione di risorse, dovremmo rispondere con la nuova posizione della risorsa e il codice di stato 201

2: Modifica - Il codice di stato qui dipenderà dal metodo. Se inviamo un POST, stai richiedendo una nuova risorsa. Se esiste già, 409 Conflict è ok. Se la richiesta crea una nuova risorsa, 201. Se inviamo un PUT, 200 o 204 sono ok

    
risposta data 21.07.2017 - 14:32
fonte
2

Basato sulla RFC menzionata nel commento di Willem Renzema sulla risposta di marstato, penso l'approccio più pulito è che il tuo POST crei una nuova risorsa. Immagino che potresti fare qualcosa di semplice come "dominio / uid / following" se non vuoi doverli cercare nel tuo client. Quindi quando vuoi smettere di seguire, cancelli quella risorsa. Se un altro post arriva per l'URI successivo quando esiste già, si restituisce 303 e si restituisce l'intestazione "Content-Location" con la risorsa "seguente".

Un vantaggio laterale della creazione delle risorse "seguenti" è che puoi utilizzarlo per creare un elenco di ciò che un utente sta seguendo.

    
risposta data 21.07.2017 - 19:06
fonte

Leggi altre domande sui tag