Avvio dell'elaborazione in modo RESTful

0

Supponiamo che tu abbia una risorsa su cui puoi eseguire normali operazioni PUT / POST / GET. Rappresenta un BLOB di dati e i metodi recuperano le rappresentazioni dei dati, siano essi metadati relativi al BLOB o al BLOB stesso.

La risorsa è qualcosa che può essere elaborata dal server su richiesta. In questo caso, un file che può essere analizzato più volte.

Come posso avviare questa elaborazione? È un po 'come RPC. C'è una buona pratica intorno a questo?

Ho letto questo: RESTFul: azioni che cambiano lo stato ma in realtà non risponde alla domanda.

(La prima volta sui programmatori.Questo è il posto giusto per questo tipo di domande, giusto?)

    
posta tom 29.10.2013 - 18:28
fonte

2 risposte

1

Il processore per questa risorsa potrebbe essere la sua risorsa. Considerare per un minuto che il nome delle risorse BLOB sia /data/ . Rendendo il processore la sua risorsa, ti permetti di realizzare diversi processori. Questo impedisce anche di dover modificare la risorsa data per facilitare l'elaborazione. Potrebbe funzionare in questo modo:

POST

Un post potrebbe assumere l'id del data che stai tentando di elaborare. Ciò restituirebbe una sorta di id che rappresenta il processo o il lavoro.

Dato un Id, questo otterrebbe il risultato dell'elaborazione. In caso contrario, è possibile restituire una risposta vuota o 204 NESSUN CONTENUTO.

HEAD

Dato un Id, questo potrebbe restituire solo lo stato senza restituire il risultato dell'elaborazione. I "metadati del lavoro", se vuoi. Se lo desideri, puoi restituire i parametri, come l'ID data che viene elaborato, la data di inizio, ecc.

Elimina

Dato un Id, questo annullerebbe la richiesta.

put

Non sono sicuro che PUT sia applicabile qui.

    
risposta data 31.10.2013 - 04:56
fonte
1

Il protocollo HTTP ha il supporto integrato per il concetto di operazioni in background o in batch sotto forma di stato codice 202:

10.2.3 202 Accepted

The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place. There is no facility for re-sending a status code from an asynchronous operation such as this.

The 202 response is intentionally non-committal. Its purpose is to allow a server to accept a request for some other process (perhaps a batch-oriented process that is only run once per day) without requiring that the user agent's connection to the server persist until the process is completed. The entity returned with this response SHOULD include an indication of the request's current status and either a pointer to a status monitor or some estimate of when the user can expect the request to be fulfilled.

I clienti apprezzeranno se la tua risposta 202 include anche un'intestazione Location in cui possono controllare lo stato. Questo è particolarmente importante per qualsiasi test automatico end-to-end.

Non sono sicuro che questa sia davvero la tua domanda, perché una grande parte di essa sembra in realtà riferirsi a Negoziazione di contenuti , che è come archiviare o recuperare "diverse rappresentazioni" di qualcosa. Naturalmente puoi avere solo URL diversi, come /widgets/1/info e widgets/1/blob , ma il modo preferito di farlo è attraverso conneg. Ci sono due intestazioni che sono rilevanti qui:

  1. Accept , che specifica cosa il client desidera ricevere ;
  2. Content-Type , che specifica cosa il invio in realtà è

Quindi, ad esempio, supponiamo tu abbia un'API widgets che dovrebbe supportare i widget nel formato "ACME" o "OMNI". Il client può inviare in entrambi i formati tramite l'intestazione Content-Type :

  • PUT /widgets/123
    Content-Type: application/vnd.foo.acme-widget+json

  • PUT /widgets/456
    Content-Type: application/vnd.foo.omni-widget+json

Il server deve comprendere entrambe le richieste e scegliere il metodo di analisi corretto basato sull'intestazione Content-Type . Sul lato ricevente, il client specifica con Accept :

  • GET /widgets/123
    Accept: application/vnd.foo.acme-widget+json

  • GET /widgets/123
    Accept: application/vnd.foo.omni-widget+json

Entrambe le richieste sono per la stessa risorsa e usano lo stesso metodo (GET), ma quando il server vede il primo, dovrebbe fornire i dati usando lo schema ACME e quando vedrà il secondo, dovrebbe fornire gli stessi dati nello schema OMNI.

Un notevole vantaggio di questo approccio è che ogni risorsa ha ancora un URI canonico che puoi usare in Location di intestazioni e così via. Non è obbligatorio, ma generalmente è ideale in REST perché ogni risorsa "viva" esattamente a un URI e non più.

Se la differenza è veramente tra data e metadata allora probabilmente dovresti avere una vera risorsa di metadati, come /widgets/123/info , ma se hai a che fare con diverse rappresentazioni di gli stessi dati allora dovresti usare Accept e Content-Type .

I pensa che copre tutti gli aspetti della tua domanda, ma se pensi che manchi qualcosa - per favore chiarisci.

    
risposta data 30.10.2013 - 01:45
fonte

Leggi altre domande sui tag