Come progettare un'API REST per gestire operazioni non CRUD?

10

Sto provando a convertire un set di servizi basati su SOAP in un'API RESTful.

Ho iniziato identificando le risorse analizzando i nomi delle operazioni e ho ottenuto la risorsa Subscription .

Quando devo aggiornare lo stato dell'abbonamento, non posso semplicemente inviare una richiesta di POST al server, perché non ho accesso diretto alle risorse, ma devo chiamare alcune operazioni in stile RPC per aggiorna le loro proprietà. Inoltre, solo e solo se sto cambiando lo stato dell'abbonamento in "attivo", è necessaria una chiamata aggiuntiva a un servizio esterno.

In questi casi, qual è la migliore pratica per gestire le operazioni sottostanti?

La soluzione che ho trovato è quella di utilizzare i parametri di query, in modo che se devo chiamare il servizio di attivazione, posso usare qualcosa del tipo:

POST /subscriptions/{subscriptionid}/?activate=true

Considerando che non posso aggiornare direttamente i miei campi oggetto Subscription, esiste una procedura migliore per gestire questo tipo di conversione?

Aggiornamento 1:

Posso inserire alcuni valori nel corpo della mia richiesta POST, ad esempio     "stato": "attivo"

e controlla all'interno del mio servizio le operazioni corrette da attivare.

    
posta Vektor88 28.06.2016 - 10:59
fonte

3 risposte

6

Devi guardare questo parlare di Jim Webber.

When I need to update the state of the subscription, I cannot simply send a POST request to the server, because I don't have direct access to the resources, but I need to call some RPC-style operations to update their properties. Additionally, only and only if I'm changing the state of the subscription to "active", an additional call to an external service is required.

Pensa ai "messaggi"; invia un messaggio al tuo dominio, descrivendo ciò che vuoi che accada. L'effetto collaterale del messaggio è che il tuo modello di dominio cambia effettivamente il suo stato. La "risorsa" è la coda dei messaggi.

POST /subscriptions/{subscriptionid}/?activate=true

L'ortografia del nome della risorsa non ha importanza per le macchine; ma le persone tendono a diventare pignoli quando gli identificatori che usi usano la convenzione secondo cui le risorse sono "nomi".

Inoltre, stiamo parlando di una risorsa subordinata a /subscriptions/{subscriptionid} , quindi convenzione (vedi RFC 3986 ) richiede di esprimere tale relazione con un segmento di percorso, anziché utilizzare la parte della query.

Quindi queste ortografie potrebbero essere ragionevoli

POST /subscriptions/{subscriptionid}/messages
POST /subscriptions/{subscriptionid}/activations
    
risposta data 28.06.2016 - 13:52
fonte
0

Se è un flag booleano per attivare / disattivare roba, direi che l'impostazione predefinita è usare JSON:

POST /subscriptions/{subscriptionid}/
{
    format: 0,
    subscription: 
    {
        active: false
    }
}

Questo è facilmente estendibile se vuoi supportare più proprietà. Un altro approccio sta dando il suo endpoint:

POST /subscriptions/{subscriptionid}/active/
DELETE /subscriptions/{subscriptionid}/active/

Personalmente, lo userei solo se lo stato di active di questo evento ha / ha proprietà che puoi poi passare / ottenere in JSON, come un ID utente o impostazione.

Se non è un valore booleano ma solo un'azione che è necessario attivare ma non richiede / ha alcun feedback sullo stato per (tranne un immediato 200 OK), utilizzerei un endpoint come questo per attivarlo molto come un RPC :

POST /subscriptions/{subscriptionid}/activate/

In caso di dubbi, leggi questo: link (vedi " Che dire delle azioni che non rientrano nel mondo delle operazioni CRUD? ")

    
risposta data 28.06.2016 - 13:35
fonte
0

REST non è funzionale. Activate è un verbo e non può essere uno stato, Active è uno stato.

Poiché RESTful non è funzionale, non puoi dire a un servizio RESTful cosa fare, ma puoi aggiungere lavoro per la coda di un servizio.

Vedi questo:

PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true

Questa richiesta è RESTful e supporta tutti i vantaggi di RESTful (come le prestazioni, l'acido ...)

    
risposta data 28.06.2016 - 16:11
fonte

Leggi altre domande sui tag