2013-06-23 12 views
5

Ho un servizio REST che gestisce i server video su una rete.REST: accesso ai membri di una raccolta tramite ID multipli

Ogni server video può essere identificato in diversi modi: tramite il suo numero di serie, in base al nome o dal numero di macchina.

Per restituire una raccolta di tutti i server disponibili sulla mia rete, le cose sono praticamente semplice: ho definito il seguente itinerario:

[Route("/servers", "GET")] 

e la seguente classe richiesta:

public class ServerCollection : IReturn<List<ServerDto>> 
{ 
    ... 
} 

Ora, vorrei restituire un server specifico dalla mia collezione, identificando o tramite il suo numero di serie, dal suo nome macchina o dal suo numero di macchina.

Per farlo, ho definito i seguenti itinerari:

[Route("/servers/{SerialNumber}", "GET")] 
[Route("/servers/machinenumbers/{MachineNumber}", "GET")] 
[Route("/servers/machinenames/{MachineName}", "GET")] 

e la seguente classe richiesta:

public class Server : IReturn<ServerDto> 
{ 
    public uint SerialNumber { get; set; } 
    public uint MachineNumber { get; set; } 
    public string MachineName { get; set; } 
} 

Quindi, posso accedere al mio collezione server tramite:

GET /servers 

e ottenere un server specifico utilizzando:

GET /servers/3 
GET /servers/machinenumbers/42 
GET /servers/machinenames/supercalifragilisticexpialidocious 

È il modo giusto di procedere? Ho la sensazione che questo non sia molto RESTful. Dovrei considerare questo come una ricerca nella mia collezione invece di utilizzare le risorse "artificiali" ?

risposta

2

Rappresenterei il servizio in un modo che è sempre univoco (numero di serie potrebbe essere corretto).

Per la query vorrei fare qualcosa come /servers/?name=[name] o /server/?id=[id] o solo /servers/[serial] (se si desidera utilizzare direttamente il numero di serie). Quando si richiede il nome o l'id, è necessario modificare l'URL nella richiesta su servers/[serial] per mantenere l'URL univoco.

1

Va bene, a patto di reindirizzare (3xx) due degli URI all'altro, invece di restituire la stessa rappresentazione (2xx) a tutti e tre. Altrimenti, avrai un bel po 'di tempo per mantenere sincronizzate le copie all'interno di una cache. Nel tuo caso, sembra logico che le risorse di machinenumbers e dei nomi dei macchinari vengano reindirizzate alle risorse del server/{id}.

Se si tratta di una ricerca generica con parametri k = v che è antitetica a REST. Ricorda che le URI identificano le risorse e le querystring fanno parte dell'URI: diverse tecniche di interrogazione identificano risorse diverse. Poiché l'insieme di termini in una forma querystring di tipo è in genere di grandi dimensioni (nell'interesse della convenienza) e i termini possono apparire in qualsiasi ordine, ciò provoca un'esplosione di risorse potenziali (se non si prevede di fare affidamento sulla memorizzazione nella cache per efficienza, quindi ci sono molte altre opzioni, ma non è REST).

2

Credo che questo sia il modo ServiceStack. Basta rendere entrambi i campi n. uint così nell'implementazione del servizio sei sicuro di quale parametro cercare.

Problemi correlati