Come fornire un servizio con API RESTful?

3

In generale, le API RESTful sono ottime per rappresentare risorse e raccolte di risorse.

E siamo bravi, se lavoriamo con le risorse.

Tuttavia, che cosa dovrebbe essere fatto, quando è necessario esporre l'API che esegue un'azione che non crea / aggiorna o elimina una risorsa.

Coppia di esempi:

  • Hai un algoritmo (ad esempio aggiungi due numeri)
  • Hai un'azione che utilizza un sistema esterno (ad esempio, invia un'email).

Ho visto due approcci:

Rappresenta un'azione come subresource

POST link

Da una parte, è semplice. D'altra parte, inizia a puzzare SOAPy (leggi chiamate RPC).

Rappresenta un'azione come risorsa autonoma

POST link

Questo sembra più RESTful. Tuttavia, non sembra giusto (solo una delle azioni CRUD è implementata). Questa risorsa in realtà non ha una rappresentazione.

Non sono sicuro, potrebbero esserci altri metodi che mi sono persi.

La domanda è: "C'è un consenso su questo argomento? Qual è il modo preferito per farlo?"

    
posta Victor Ronin 23.04.2014 - 18:17
fonte

2 risposte

3

Poiché i verbi in REST sotto HTTP sono limitati ai verbi HTTP, tutto nell'URI dovrebbe essere il nome di un nome. Quindi il trucco comune è fare ciò che dici - convertire il verbo personalizzato (sendemail) in un nome del processore (emailsender).

All'inizio sembra un trucco di parole, ma ha qualche merito. È quindi possibile utilizzare la disposizione "elaborazione dati" del verbo POST per inviare comandi al processore. Si apre la porta a risposte come un 202 accettato se si desidera eseguire l'elaborazione asincrona.

Una cosa a cui prestare attenzione è la collisione nello spazio dei nomi; il nome del processore può entrare in collisione con lo spazio dei nomi dell'identificatore. Ad esempio:

http://some/site/users/SomeCoolDude

http://some/site/users/emailprocessor

... ora non puoi avere un utente chiamato "emailprocessor" perché si scontra con il nome del processore. Questo potrebbe non essere un problema se gli ID sono inte o UUID, ma è qualcosa da tenere a mente.

...

(E la risposta rigorosa è che tutti gli URI che il client usa dovrebbero provenire da hypermedia, quindi il design dell'URI dovrebbe essere comunque opaco per l'utente.)

    
risposta data 23.04.2014 - 18:45
fonte
1

Probabilmente non c'è consenso sulle soluzioni per tali azioni. Ehi, da quello che ho letto non c'è nemmeno consenso su come implementare tutti i richiesti caratteristiche di un'API REST .

Per eseguire azioni diverse, è sufficiente utilizzare le risorse di archiviazione che possono essere utilizzate per gli URL basati sulle risorse. Ad esempio l'invio di posta potrebbe essere implementato come richiesta POST di una risorsa di messaggio alla raccolta di messaggi di un utente specifico:

http://example.com/users/me/messages

Il software che gestisce questa richiesta può svolgere un lavoro aggiuntivo durante l'archiviazione di questa risorsa. Nel caso di e-mail utilizzare un campo di stato che indica se si tratta di una bozza o meno, e in caso contrario una bozza invia la risorsa ai destinatari descritti nella risorsa.

Per cose come un servizio di calcolo questo può essere più difficile.

In generale mi piace guardarlo in questo modo: come posso scambiare una risorsa con il tipo mime HTML su HTTP usando un browser come client? Ciò corrisponde alla più grande API RESTful che conosca.

    
risposta data 23.04.2014 - 23:44
fonte

Leggi altre domande sui tag