Se un'API REST implementata con jax-rs restituisce un'interfaccia o un'implementazione

1

Penso di conoscere la risposta, ma mi piacerebbe esserne sicuro.

Quando jax-rs viene utilizzato per implementare un'API REST, un metodo @GET dovrebbe restituire un'interfaccia, un'implementazione o un'implementazione astratta?

Se restituisce un'interfaccia, a volte non sarà ovvio sapere cosa sta effettivamente restituendo: ad esempio, la serializzazione json di un'istanza di questa interfaccia può essere completamente diversa dalla serializzazione json di un'altra istanza. Allo stesso tempo, non sapremo come deserializzare il json sul lato client.

Se restituisce un'implementazione, non sarà facile sostituire questa classe di implementazione con qualcos'altro. Potrebbero esserci casi d'uso in cui non saremo in grado di offrire un'API personalizzabile agli integratori di sistema.

Non voglio aprire un dibattito: voglio sapere cosa si fa di solito in casi d'uso reali.

    
posta Andreu Andon 03.05.2017 - 14:05
fonte

1 risposta

1

Come probabilmente presumi già, la risposta è che dipende. Dipende da cosa vuoi fare.

I tuoi clienti non si preoccupano di quale sia l'implementazione dell'API REST, se si tratta di JAX-RS, servlet semplici o altro. Si preoccupano delle risorse che il tuo servizio espone e di come interagire con le loro rappresentazioni (che sono per lo più fatte con JSON o XML).

Scegliamo su JSON, che è quello che probabilmente usi poiché la maggior parte delle esercitazioni JAX-RS là fuori usano Jackson per la serializzazione. Una libreria come Jackson - per impostazione predefinita - esamina l'oggetto reale quando esegue la serializzazione, i suoi getter e setter pubblici e non le interfacce dell'oggetto. Quindi, non importa se il tuo metodo annotato @GET restituisce un'interfaccia o un metodo. Questo è importante solo per come stai implementando il servizio. Non per i tuoi clienti. Per te!

L'utilizzo di un'interfaccia invece di un'implementazione offre alcuni vantaggi. Leggi qui per esempio: link

Ma ancora una volta, questi sono i vantaggi per te come sviluppatore del servizio, il tuo cliente non è a conoscenza dell'implementazione del servizio, solo sui dati che scambia con esso.

Ci sono anche degli svantaggi. Se i tuoi controller restituiscono tutte le interfacce, come fai a sapere quali restituiscono, ad esempio, un Customer e quali restituiscono un Invoice . Non lo fai, perché hai deciso che tutti restituiscono un Entity (o qualsiasi altra cosa sia l'interfaccia comune), e ora devi cercare nel codice per vedere cosa restituisce ciascun metodo. Inoltre, alcuni sviluppatori che lavorano con te sul servizio potrebbero decidere che a un certo punto lo stesso metodo può restituire sia un Customer che un Invoice solo perché il tipo restituito gli consente di essere qualsiasi Entity . E ora hai un'API REST che si comporta in modo strano.

Come ho detto, dipende da cosa vuoi fare. Non c'è solo una cosa "di solito fatta in casi di uso reale".

    
risposta data 05.05.2017 - 16:48
fonte

Leggi altre domande sui tag