Devo essere permissivo di parametri sconosciuti?


12

Sto progettando un'API RESTful e sto affrontando il problema del titolo, ribadito per chiarezza:

Devo fallire velocemente se un client invia un parametro non riconosciuto? Per esempio,

http://example.com/api/foo?bar=true&paula=bean

In quanto sopra, barè un parametro valido ma paulanon è specificato dall'API. Dovrei

  • Avvertire il client dell'errore
  • Fallire velocemente
  • Ignoralo

Se avverto il client, posso solo emettere un avviso per il primo parametro, dal momento che potrebbero inviarne un numero quasi infinito e presumibilmente il server ha cose migliori da fare. Allo stesso modo, in caso di errore, specifica solo il primo parametro non valido come problema.

Preferisco il fallimento rispetto all'emissione di un avvertimento per costringere il programmatore ad agire, poiché altrimenti potrebbero ignorare il problema e continuare a sprecare risorse, o finire col cagionare il carico inavvertitamente. Non fare nulla è anche peggio sotto questo aspetto.

I miei argomenti hanno senso? Esiste una pratica accettata su tali cose?


Sulla base di un piccolo test, tutti i siti che ho testato ignorano semplicemente i parametri sconosciuti che li ho forniti.
Bart van Ingen Schenau,

@BartvanIngenSchenau Lo stesso qui. Va bene per le pagine Web, ma non penso che vada bene per una vera API
rath

2
Una preoccupazione è la compatibilità futura. Se vengono ignorati argomenti sconosciuti, è possibile utilizzarli nelle versioni future in modo tale che i client possano programmare sulla nuova API e ottenere comunque un comportamento ragionevole sui vecchi server.
Walpen

@walpen Questo è un punto interessante. L'uso di URL con versione api/v1ecc. Potrebbe occuparsene, ma non consente comunque aggiornamenti incrementali. +1
rath

Qui puoi trovare alcuni pro e contro da una prospettiva reale: parametri rigorosi e la tua API .
Remek Ambroziak,

Risposte:


12

A mio avviso, dovresti restituire uno stato Richiesta non valida, in modo che il client sappia che ciò che sta cercando di fare non è valido. La mia opinione su questo è influenzata dal concetto che le API RESTful sono rilevabili . Se stai fornendo informazioni sufficienti in anticipo, il client non prova mai a fare una richiesta non valida per cominciare. Se lo fa, allora c'è qualcosa di sbagliato nel codice client e fallire velocemente avviserà il secondo di questo errore. Naturalmente, questo è un approccio molto purista e potrebbe non essere consigliato se l'API non è rilevabile.

Un approccio più pragmatico potrebbe essere quello di ignorare i parametri non validi, ma in entrambi i casi, assicurati di documentare bene il comportamento.


1
Come estensione: se un client invia alcuni parametri sconosciuti / di sola lettura / deprecati, ciò significa che il client si aspetta un comportamento che non sarà soddisfatto. E quindi è pericoloso compiere qualsiasi azione. Quindi sono d'accordo, richiesta
assolutamente negativa

Grazie @StepanStepanov, ma c'è la filosofia "Sii permissivo in ciò che accetti, esplicito su ciò che invii" alla base di gran parte dell'architettura del web. Con questo in mente, potrei facilmente scrivere una risposta in opposizione diretta a quella che ho già scritto.
RubberDuck,

3
Ho cercato su Google))) E la pagina sulla legge di Postel dice anche "il codice che riceve input dovrebbe accettare input non conformi purché il significato sia chiaro". Penso che se il client ci invia qualche parametro sconosciuto, il suo significato non può essere chiaro. Se il client ci invia un parametro obsoleto, è chiaro, non funzionerà come prima e come previsto dal client. Se il client ci invia un parametro di sola lettura è chiaro, non verrà scritto come desidera il client.
Stepan Stepanov,

0

Se usi API pubbliche (o API che verranno utilizzate da altri team), consiglierei l'errore di restituzione come suggerito da @RubberDuck.

Se l'API verrà consumato solo all'interno della tua squadra (o solo da te stesso), forse sarà più facile ignorare i campi aggiuntivi (ad es. Richiede meno codice e più facile da fare).

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.