Come posso rappresentare qualcosa come "ultime notizie" in REST API?

1

Non riesco a capire come.

1) Identificazione risorsa . Come identifico la risorsa? Qualcosa come questo? /latest_news/<id> Non sembra giusto.

2) Supponiamo ora di avere un URL per la risorsa latest news . Ora ogni richiesta per lo stesso URL può darti una rappresentazione diversa. Viola qualsiasi vincolo di REST?

3) E il vincolo stateless sul server REST? La wiki dice:

The client–server communication is constrained by no client context being stored on the server between requests.

Per servire latest news , un server deve eseguire un monitoraggio che è lo stato interno del server. Tuttavia, credo che il server possa ancora essere chiamato stateless nel senso del vincolo stateless REST perché quello stato non è client context . O mi sono perso qualcosa?

Grazie in anticipo.

    
posta du369 31.10.2018 - 08:15
fonte

3 risposte

8

Now each request for the same URL may give you a different representation. Does it violet any constraint of REST?

Non intrinsecamente. Dipende da come la richiesta è diversa.

  • Se sono diversi nel tempo (come suggeriscono le ultime notizie), allora va benissimo.
  • Se vengono lanciati da utenti diversi che ricevono contenuti personalizzati, va bene anche
  • Se sono diversi in base alla conoscenza implicita delle azioni passate di questo utente, non va bene, in quanto ciò significa che stai monitorando / facendo affidamento su uno stato utente e quindi non stai lavorando senza stato.

In order to serve latest news, a server must do some tracking which is the internal state of the server.

Lo "stato" in "stateless" si riferisce a uno stato utente . Non sono abbastanza sicuro di cosa intendi per stato del server, ma se vuoi dire cose come controllare il database (o una terza parte) per le ultime notizie, questo è ovviamente ammissibile.

Ad esempio, supponiamo che l'utente carichi la pagina, che chiama /latest_news/ (senza parametri) e quindi riceve articoli A,B,C . Mentre legge questi articoli, D e E vengono aggiunti al server.

Un secondo utente chiama /latest_news/ (senza parametri) e riceve A,B,C,D,E .

In un secondo momento, il primo utente chiama di nuovo /latest_news/ (nessun parametro), e tu intendi solo dargli D,E perché ha già visto A,B,C .

L'ultima parte in corsivo è il problema. Stai facendo affidamento sulla conoscenza degli articoli che l'utente ha già letto, il che significa che stai monitorando il loro stato.

How can I represent something like “latest news” in REST api?

In parole povere, i tuoi valori di ritorno non possono essere decisi in base a cose che hai tracciato segretamente sull'utente (parametri impliciti).

Ciò che sarebbe accettabile, tuttavia, sta usando i parametri espliciti . Ad esempio, /latest_news/?since=C (che recupera tutti gli articoli caricati dopo C) è perfettamente accettabile, poiché il server sta dando al cliente esattamente ciò che chiede esplicitamente.

    
risposta data 31.10.2018 - 08:38
fonte
1

Buone risposte finora ma lasciatemi aggiungere un'altra prospettiva. Cosa sono le "ultime notizie" ma una decisione tipo?

Le "ultime notizie" non sono solo "notizie" ordinate in ordine decrescente per data / ora?

La tua domanda non attribuisce particolari vincoli all'insieme di "ultimi", quindi per me il miglior design è applicarlo come il tipo predefinito del tuo elenco di articoli di notizie (che comunque sembra comune) come / news. Questo è più breve, più facile da scrivere e, secondo me, più espressivo.

    
risposta data 31.10.2018 - 11:53
fonte
1

1 Potresti usare un alias

GET /news/latest-news/

Per identificare una specifica "ultima novità", il tuo approccio è giusto

GET /news/latest-news/{latest-news-id}

2 Non esattamente. La rappresentazione e il contenuto non sono la stessa cosa. Mentre il contenuto potrebbe cambiare da un giorno all'altro, la tua rappresentazione non dovrebbe cambiare. Ad esempio, la risposta a # 1 potrebbe essere un elenco di rappresentazioni di notizie, formattate come JSON, XML, HTML, testo normale. Questo non cambierà da richiesta a richiesta. Ciò che potrebbe cambiare è il contenuto, le notizie vengono recuperate. Lo stato delle risorse potrebbe cambiare e quindi il contenuto della risposta.

3 questo è un altro argomento. La chiave per mantenere il server stateless è assicurando che il client fornisca tutto ciò di cui il server ha bisogno per rispondere alla richiesta in modo che il server non debba tenere traccia delle richieste precedenti del client (se il client è loggato o no, se il client ha visitato la pagina X, se il cliente ha fatto clic qui o là).

Pensa al tuo cliente come a un'applicazione isolata. Tale applicazione mantiene il proprio stato (pagina corrente, ultima azione, corrente nuova visitata, ecc.) In base all'attività dell'utente. Tale stato dovrebbe essere mantenuto dal client e mai delegato al server. In caso contrario, il server mantiene "lo stato" del client, trasformando il server in stato, dal momento che mantiene lo stato di tutti i client. Quindi, assicurati che tutto ciò che il server deve rispondere sia fornito dal client (id, token di autorizzazione, parametri di query, parametri del corpo, ecc.) In ogni singola richiesta e che il client abbia tutto ciò che è necessario per richiedere risorse al server.

In order to serve the latest news, a server must do some tracks which are the internal state of the server.

Ovviamente, le risorse sul lato server saranno sempre in uno o in un altro stato e il business del server sarà in grado di tenere traccia, conservare e recuperare tale stato. I dati infatti sono stateful, ciò che dovrebbe restare apolidi è il "dialogo" tra client e server. Il server non deve contenere informazioni sul client per risolvere ulteriori richieste dallo stesso client.

    
risposta data 31.10.2018 - 09:09
fonte

Leggi altre domande sui tag