Codice di stato HTTP per una richiesta parzialmente riuscita


115

Ho un'applicazione che invia messaggi agli utenti. In una richiesta di post viene trasferita una stringa XML composta da tutti gli utenti che dovrebbero ricevere quel particolare messaggio. Se uno qualsiasi degli utenti nell'elenco non esiste, restituisco l'elenco degli utenti mancanti al cliente per un'ulteriore valutazione.

Ora mi chiedo quale sarebbe il codice di stato corretto per l'applicazione dicendo che la richiesta è stata accettata ma c'erano cose che non potevano essere fatte.

Il problema verrebbe evitato se non fosse consentito includere gli utenti mancanti nell'elenco. Quindi il tentativo di invio otterrebbe solo un errore 4xx. Ma non ha senso formare l'API in questo modo. D'altra parte potrei considerare la condizione di errore puramente specifica dell'applicazione. Ma inviare un 200 semplicemente non sembra giusto. E sarebbe bello dare al cliente un suggerimento quando guardare in profondità nella risposta all'errore. ad esempio, per evitare di inviare messaggi a quegli utenti più e più volte

Risposte:


66

Ho affrontato un problema molto simile. In questo caso, ho restituito un file

207 Multi-Stato

Ora, questo non è HTTP rigoroso, fa parte dell'estensione WebDAV, quindi se non hai il controllo anche sul client, allora non va bene per te. Se lo fai, potresti fare qualcosa del genere:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Ma ancora una volta, questa è un'estensione HTTP e devi avere anche il controllo del client.


3
Ho pensato di usarlo ma non mi sentivo abbastanza a mio agio. Grazie!
Norbert Hartl

La cosa bella è che puoi restituire tutti i dati pertinenti che desideri, il che è particolarmente utile per i set di dati misti, ad esempio: dove alcuni falliscono e altri passano.
Kylar

Capisco. Sto solo cercando di evitare un ulteriore livello di gestione dello stato (che non è carino IMHO). La maggior parte del mio codice funziona con quelli HTTP. E penso che il mio caso d'uso descritto andrà bene senza.
Norbert Hartl

Puoi sempre restituire un corpo: invia un 200 con una risposta JSON o qualsiasi cosa desideri per determinare quali hanno avuto successo.
Kylar

Si, lo so. Ma se restituisci un corpo, devi analizzarlo. In quel momento introducete un secondo livello di gestione della logica dell'applicazione. Ciò aumenta la complessità e quindi è necessaria una buona ragione per farlo.
Norbert Hartl

65

Ho avuto lo stesso problema e ho finito per utilizzare due diverse soluzioni:

  • Codice di ritorno HTTP 202: Accepted, che indica che la richiesta era a posto, ma non c'è alcuna garanzia che tutto sia andato come dovrebbe.
  • Restituisce un valore normale 200nella risposta, ma includi un elenco di ciò che non è stato visualizzato nel corpo della risposta.

Il secondo di solito funziona meglio, ma il primo è ottimo se sei pigro o usi una coda per l'elaborazione.


5
Il 202 non si riferisce più a qualcosa come fare la coda?
Sinaesthetic

6
Sì, @Sinaesthetic. Dalle più recenti specifiche HTTP 1.1, "(...) la richiesta è stata accettata per l'elaborazione, ma l'elaborazione non è stata completata". Quindi, per un successo parziale, 202 non è appropriato.
Huercio

-4

Che dire dell'utilizzo di 206 contenuto parziale. So che 206 riguarda più gli intervalli, ma cosa succederebbe se potesse indicare una richiesta parzialmente riuscita?


MDN afferma come segue: "Il codice di risposta dello stato di successo del contenuto parziale HTTP 206 indica che la richiesta è riuscita e il corpo contiene gli intervalli di dati richiesti, come descritto nell'intestazione Range della richiesta." Per quanto ho capito, 206 Contenuto parziale è strettamente per le richieste con una gamma di contenuti.
ffs

-14

L'HyperText Transfer Protocol si occupa della trasmissione delle cose. Non ha codici di errore per gestire gli errori a livello di applicazione.

Restituire 200 è la cosa giusta da fare qui. Per quanto riguarda HTTP, la richiesta è stata ricevuta correttamente, gestita correttamente e stai restituendo la risposta. Quindi, a livello HTTP tutto è OK. Eventuali errori o avvisi relativi all'applicazione eseguita su http dovrebbero essere all'interno della risposta. In questo modo eviterai anche alcuni fastidiosi problemi che potresti incontrare con i server proxy che potrebbero non gestire determinate risposte nel modo previsto.


18
HTTP è un protocollo a livello di applicazione. Non puoi metterlo semplicemente a livello di trasporto e applicazione. Se pensi all'OSI, l'HTTP si trova sui livelli 5-7. HTTP è leggermente diverso. La maggior parte delle intestazioni e dei codici di ritorno sono effettivamente specifici dell'applicazione. I codici dipendono solo dalle informazioni fornite nelle entità del protocollo HTTP e non dalle cose del formato dell'applicazione personalizzata. Per quanto riguarda il 200 direi che la tua definizione è puramente sbagliata se applicata a verbi che non sono POST. Ma il POST cambia un po 'il gioco e in questo contesto la tua ipotesi "gestita correttamente" non è sicura
Norbert Hartl

A rigor di termini OSI considera HTTP un protocollo a livello di applicazione e quando si parla con un server web "normale" questo è vero. Ma nel tuo caso stai eseguendo il tuo protocollo su HTTP, come fanno molte applicazioni in questi giorni. In questo tipo di utilizzo HTTP fornisce solo il trasporto. (L'applicazione invia messaggi agli utenti, non trasferisce ipertesto ...)
AVee

2
Giusto per essere chiari. HTTP in modo REST è incentrato sulle risorse. In questo contesto 200 significa identità (la risorsa che hai specificato) invece di 3xx che punta in direzione dell'identità. L'uso di POST trasforma l'URI della risorsa in un URI di elaborazione e devono essere gestiti i codici di errore. Il contesto cambia un po 'e la definizione delle cose diventa un po' sfocata o almeno difficile da capire
Norbert Hartl

1
Il cambio di contesto significa anche che non ci sono codici di errore adatti, dal momento che il protocollo non è mai stato progettato pensando a quel contesto ;-) Penso anche che dovresti fare attenzione quando usi i codici di errore poiché i server proxy tendono a funzionare con loro sostituendo la tua risposta con un pagina di errore personalizzata, questa può essere una vera PITA.
AVee

1
Comunque, grazie per aver risposto alla mia domanda. Ho appena scoperto che stackoverflow è un cattivo client di chat :)
Norbert Hartl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.