Le migliori pratiche per ottenere una risorsa in molti modi diversi?

0

Un esempio di questo problema:

Sto scrivendo una funzione che consente a un utente di trovare uno studente dal suo studente, quindi creo la funzione: GetStudent(int id) o GetStudentById(int id)

Quindi gli utenti vogliono ottenere uno studente da SSN, quindi creo una funzione GetStudent(string ssn) o GetStudentBySSN(string ssn)

Quindi altri requisiti espongono GetStudent(string first, string last) e GetStudent(string phoneNumber)

Questi non sono esempi particolarmente validi perché il primo / ultimo potrebbe non essere univoco, ma diciamo per il fatto che vuoi solo restituire il primo studente pertinente.

Il risultato di tutto questo è un'API gonfia.

Un'alternativa che ho sentito discutere: 1. GetStudent (Dictionary searchCriteria), dove la chiave è qualcosa come "id", "ssn", ecc e il valore è l'id corrispondente o ssn. L'implementazione quindi eseguirà l'analisi del dizionario e utilizzerà i criteri di ricerca inoltrati. Sembra meno intuitivo da usare e qualcuno dovrebbe consultare i documenti per vedere le opzioni (non la fine del mondo).

Quindi qual è la migliore pratica qui? C'è una terza opzione (migliore)? Cambia se stai costruendo una API web invece di una libreria? Restful sembra che sarebbe / student / {id} per ottenere da id, e non sono sicuro di cosa verrà dopo.

    
posta Zak 31.08.2018 - 21:58
fonte

2 risposte

1

The result of all this is a bloated API.

Sai con ragionevolezza chi consumerà l'API e i dati che produce? (Almeno inizialmente, queste cose cambiano sempre nel tempo.) Se è così, chiedi loro cosa vogliono.

Quindi considera anche quali dati sono disponibili quando. Potrebbe essere che alcuni dati non siano sempre accessibili in ogni momento. Ad esempio, se ci sono campi che vengono calcolati anziché archiviati direttamente, non potrai accedervi finché non sono stati calcolati. Ciò potrebbe influire sulla possibilità di rendere tutti i campi sempre disponibili in qualsiasi momento.

Suggerirei vivamente contro l'approccio che prevede che il chiamante fornisca un dizionario di coppie chiave-valore per i dati che desidera. Vi è un notevole dolore in questa strada sia per te che per un utente dell'API. Cose che non possono essere scoperte dai compilatori come errori di ortografia delle chiavi, chiavi non valide, chiavi che non sono più supportate, ecc. Rende difficile l'uso dell'API, difficile eseguire il debug dell'API per te e difficile deprecare le cose nel futuro e modifica l'API.

    
risposta data 01.09.2018 - 07:48
fonte
1

Vorrei prima esaminare i tuoi requisiti specifici prima di decidere una linea d'azione. Il modo in cui progetta la tua API dipenderà molto da ciò che tali requisiti sono. Ad esempio, i tuoi utenti sono abbastanza sofisticati per gestire un'API più generale con meno metodi?

Uno dei motivi per cui potresti desiderare più metodi è che può fornire un controllo preciso sulla tua API. Un metodo come

FindStudent(string fieldName, string searchTerm);

deve essere attentamente progettato per evitare abusi, sulla falsariga dell'iniezione SQL o dell'accesso a un campo a cui l'utente non ha diritti. Metodi specifici che sono molto limitati nel loro scopo sono più facili da controllare, perché hai meno scenari di abuso possibili da affrontare.

    
risposta data 31.08.2018 - 23:39
fonte

Leggi altre domande sui tag