2013-04-16 15 views
8

Stiamo progettando un'API RESTful per restituire raccolte di documenti. La nostra implementazione iniziale utilizza i codici di stato HTTP per indicare se una richiesta non può essere soddisfatta. Questa sembra essere una best practice ampiamente accettata (si veda ad esempio here).Come devono essere gestite le eccezioni in un'API RESTful per i risultati della raccolta?

Di recente abbiamo riscontrato un problema in cui un utente stava caricando 1000 documenti. Uno dei recuperi del documento non è riuscito e quindi abbiamo restituito un codice di stato HTTP 500.

Un'alternativa sarebbe quella di restituire un codice di stato HTTP 200 con il payload con i 999 documenti che siamo stati in grado di recuperare, e quindi una raccolta di errori che indica quella che ha avuto esito negativo.

Questo approccio alternativo è una violazione dei principi RESTful? Come dovrebbe essere gestita questa situazione? Ci sono opzioni oltre a questi due approcci?

risposta

2

Sì, penso che sia perfettamente accettabile se si documenta che i dati che si stanno restituendo possono contenere una raccolta di "errori". Ciò significa che qualunque sia il tipo di media semantico che stai usando per descrivere questa collezione di documenti, dovrebbe avere una documentazione che descriva come dovrebbe essere la collezione di documenti e come dovrebbe apparire la collezione di errori. Il cliente può quindi decidere cosa fare con queste informazioni.

Per esempio, se si restituisce questo come JSON (solo un esempio), si può avere un tipo di supporto come application/json+documents o qualcosa del genere, che potrebbe assomigliare a questo:

{ data : { 
    documents: [ ... ], //document objects 
    errors: [ ... ] //error objects 
} 

Si potrebbe quindi avere documentazione descrive come appaiono i documenti e come appaiono gli errori. Nelle API veramente RESTful sono i tipi di media documentati e non le chiamate, perché in un'API veramente RESTful esiste un solo endpoint e tutto il resto viene "scoperto" tramite quell'endpoint iniziale, insieme ai tipi di media semantici. Quindi, se documenti che gli errori sono possibili e descrivi il formato in cui verranno consegnati gli errori, dovresti stare bene.

Anche questa non è una condizione "eccezionale" poiché sembra essere nel tuo caso che è prevedibile che un cliente non sia in grado di recuperare tutti i documenti. Quindi è giusto informare il cliente di questo fatto.

+0

Grazie Vivin per l'input. Quindi immagino che una possibile linea di divisione sia se la situazione è considerata "eccezionale" o meno. Se lo è, deve essere restituito uno stato HTTP 500. Se la situazione non è un'eccezione e si può prevedere che si verifichi regolarmente come parte del normale utilizzo dell'API, allora forse un HTTP 200 è più appropriato, inviando le informazioni di errore nel contenuto del carico utile (ben documentato!). –

+0

@JoeAlfano corretto. Se si tratta di un'eccezione * effettiva * da cui l'utente non può realmente eseguire il ripristino, un HTTP 500 va bene. Altrimenti, puoi fornire qualsiasi dato parziale che possiedi, insieme agli errori e l'utente può decidere come gestirlo. –

1

C'è una linea che a volte devi attraversare in una situazione unica come questa: coinvolgere l'utente.

Non è irragionevole informare l'utente che il carico utile è troppo grande e restituire un errore interno del server.

Problemi correlati