È comprensibile essere un po 'confuso su come utilizzare correttamente REST in base a tutti i modi in cui ho visto grandi aziende progettare le loro API REST.
Hai ragione in quanto REST è un sistema di raccolta delle risorse. È l'acronimo di Representational State Transfer. Non un'ottima definizione se me lo chiedi. Ma i concetti principali sono i 4 VERB HTTP e l'apolidia.
Il pezzo importante da notare è che hai solo 4 VERBI con REST. Questi sono GET, POST, PUT e DELETE. Il tuo resend
esempio sarebbe l'aggiunta di un nuovo verbo a REST. Questa dovrebbe essere una bandiera rossa.
Domanda 1
È importante rendersi conto che il chiamante dell'API REST non dovrebbe sapere che l'esecuzione di un PUT
nella raccolta comporterebbe la generazione di un'e-mail. Questo mi profuma di una perdita. Quello che potrebbero sapere è che l'esecuzione di a PUT
potrebbe comportare attività extra che potrebbero essere interrogate in seguito. Lo saprebbero eseguendo una GET
risorsa recentemente creata. Ciò GET
restituirebbe la risorsa e tutti gli Task
ID risorsa associati. Successivamente, è possibile eseguire una query su tali attività per determinarne lo stato e persino inviarne una nuova Task
.
Hai alcune opzioni.
REST - Approccio basato sulle risorse dell'attività
Creare una tasks
risorsa in cui è possibile inviare attività specifiche nel proprio sistema per eseguire azioni. È quindi possibile GET
l'attività in base alla ID
restituita per determinarne lo stato.
Oppure puoi combinare un SOAP over HTTP
servizio Web per aggiungere un po 'di RPC alla tua architettura.
interrogazione per tutte le attività per una risorsa specifica
GET http://server/api/myCollection/123/tasks
{ "tasks" :
[ { "22333" : "http://server/api/tasks/223333" } ]
}
esempio di risorsa attività
PUT http://server/api/tasks
{
"type" : "send-email" ,
"parameters" :
{
"collection-type" : "foo" ,
"collection-id" : "123"
}
}
==> restituisce l'id dell'attività
223334
GET http://server/api/tasks/223334
{
"status" : "complete" ,
"date" : "whenever"
}
RIPOSO - Utilizzo di POST per attivare azioni
Puoi sempre POST
aggiungere dati a una risorsa. Secondo me ciò violerebbe lo spirito di REST ma sarebbe comunque conforme.
Puoi fare un POST simile a questo:
POST http://server/api/collection/123
{ "action" : "send-email" }
Aggiornerai la risorsa 123 dalla raccolta con dati aggiuntivi. Tali dati aggiuntivi sono essenzialmente un'azione che dice al back-end di inviare un'e-mail per quella risorsa.
Il problema che ho con questo è che un GET
sulla risorsa restituirà questi dati aggiornati. Tuttavia, ciò risolverebbe i tuoi requisiti e rimarrebbe comunque RESTful.
SOAP - Servizio Web che accetta risorse ottenute da REST
Creare un nuovo servizio Web in cui è possibile inviare e-mail in base all'ID risorsa precedente dall'API REST. Non entrerò nei dettagli di SOAP qui poiché la domanda originale riguarda REST e questi due concetti / tecnologie non dovrebbero essere confrontati in quanto sono mele e arance .
Domanda 2
Hai anche alcune opzioni qui:
Sembra che molte grandi aziende che pubblicano le API REST espongano una search
raccolta che è davvero solo un modo per passare parametri di query per restituire risorse.
GET http://server/api/search?q="type = myCollection & someField >= someval"
Che restituirebbe una raccolta di risorse REST pienamente qualificate come:
{
"results" :
{ [
"location" : "http://server/api/myCollection/1",
"location" : "http://server/api/myCollection/9",
"location" : "http://server/api/myCollection/56"
]
}
}
Oppure puoi consentire qualcosa come MVEL come parametro di query.
Domanda 3
Preferisco i sotto-livelli piuttosto che dover tornare indietro e interrogare l'altra risorsa con un parametro query. Non credo che ci sia alcuna regola in un modo o nell'altro. È possibile implementare entrambi i modi e consentire al chiamante di decidere quale sia più appropriato in base al modo in cui è entrato per la prima volta nel sistema.
Appunti
Non sono d'accordo sui commenti di leggibilità degli altri. Nonostante ciò che alcuni potrebbero pensare, REST non è ancora destinato al consumo umano. È per il consumo della macchina. Se voglio vedere i miei tweet, utilizzo il normale sito Web di Twitter. Non eseguo un REST GET con la loro API. Se voglio fare qualcosa a livello di programmazione con i miei tweet, allora uso la loro API REST. Sì, le API dovrebbero essere comprensibili, ma la tua gte
non è poi così male, non è semplicemente intuitiva.
L'altra cosa principale con REST è che dovresti essere in grado di iniziare in qualsiasi punto della tua API e navigare verso tutte le altre risorse associate SENZA conoscere l'URL esatto delle altre risorse in anticipo. I risultati del GET
VERB in REST dovrebbero restituire l'URL REST completo delle risorse a cui fa riferimento. Quindi, invece di una query che restituisce l'ID di un Person
oggetto, restituirebbe l'URL completo come http://server/api/people/13
. Quindi puoi sempre navigare programmaticamente i risultati anche se l'URL è cambiato.
Risposta al commento
Nel mondo reale ci sono in effetti cose che devono accadere che non creano, leggono, aggiornano o eliminano (CRUD) una risorsa.
Ulteriori azioni possono essere intraprese sulle risorse. Tipici database relazionali supportano il concetto di Stored Procedures. Questi sono comandi aggiuntivi che possono essere eseguiti su un set di dati. REST non ha intrinsecamente questo concetto. E non c'è motivo per cui dovrebbe. Questi tipi di azioni sono perfetti per i servizi Web RPC o SOAP.
Questo è il problema generale che vedo con le API REST. Agli sviluppatori non piacciono i limiti concettuali che circondano il REST, quindi lo adattano per fare quello che vorrebbero. Ciò lo rompe dall'essere un servizio RESTful però. In sostanza, tali URL diventano GET
chiamate su servlet pseudo-REST-like.
Hai alcune opzioni:
- Creare una risorsa di attività
- Supporto di
POST
dati aggiuntivi per la risorsa per eseguire un'azione.
- Aggiungere i comandi aggiuntivi tramite un servizio Web SOAP.
Se utilizzassi un parametro di query quale VERB HTTP useresti per reinviare l'e-mail?
GET
- Questo reinvia l'e-mail E restituisce i dati della risorsa? E se un sistema memorizzasse nella cache quell'URL e lo trattasse come l'URL univoco per quella risorsa. Ogni volta che colpiscono l'URL, invia di nuovo un'email.
POST
- In realtà non hai inviato nuovi dati alla risorsa, solo un parametro di query aggiuntivo.
Sulla base di tutti i requisiti indicati, fare un problema POST
con la risorsa con un action field
dato POST risolverà il problema.