2011-09-13 4 views
9

Sto creando un servizio web WCF con il servizio di autenticazione WcF e il primo set di funzioni necessario è la gestione di una casella di posta in arrivo per un client. Il client sarà determinato dall'autenticazione.Sto progettando correttamente questa interfaccia REST di WCF?

Questo è il mio tentativo di un design RESTful delle API:


https://api.mydomain.com/v1/inbox/messages (GET)

restituisce una pagina dei risultati nel casella di posta con un filtro di ricerca opzionale applicato

  • Conte - numero di record per pagina
  • Pagina - pagina iniziale
  • Sort - campo (opzionale) per ordinare il
  • Ricerca - (opzionale) testo da cercare

https://api.mydomain.com/v1/inbox/mark (POST)

Marks uno o più messaggi letti o non letti

  • Azione - MarkRead o MarkUnread
  • MessageIDs - elenco di ID messaggio per contrassegnare

https://api.mydomain.com/v1/inbox/archive (POST)

Archives uno o più messaggi

  • MessageIDs - lista dei messaggi per archiviare gli ID

Sto facendo questo diritto? In caso contrario, quale sarebbe un modo migliore per progettare questa interfaccia?

+0

Suoni come letti e non letti possono far parte del tuo secondo URL? 'https: // api.mydomain.com/v1/inbox/mark/read' e' https: // api.mydomain.com/v1/inbox/mark/unread' –

+0

Dovrebbero essere due funzioni separate o una funziona con un parametro (che è più normale nell'API RESTful)? – Jason

+0

se fai ciò che ho suggerito, allora sarebbero due punti finali, giusto? come in due URL. Ma il sistema può gestirli con lo stesso metodo. –

risposta

0

Riguardo alla parte letta/non letta Non penso che sia necessario un post. Penso che è necessario mettere metodo https://api.mydomain.com/v1/inbox/messageId/Read https://api.mydomain.com/v1/inbox/messageId/Unread

Messaggio necessario quando si crea un nuovo record e si desidera aggiornare

per Archive parte I sono d'accordo. Ricorda solo di restituire i risultati per il processo di archiviazione.

1

Martin Fowler ha un good summary del Maturity Model Richardson e quello che serve per rendere un servizio RESTful. Jan ha fatto riferimento a uno dei post di Roy Fielding, ma ci sono alcuni passaggi da seguire oltre a hypermedia (e HATEOAS).

Con riferimento allo Richardson model, penso che la vostra API necessiterebbe di alcune modifiche per arrivare a "Livello 3" (duh duh duhhhh). La collezione /v1/inbox/messages sembra valida e il solo supporto di GET indica che si tratta di una risorsa di sola lettura per l'utente. Tuttavia, le azioni e gli ID e /v1/inbox/archive sono solo tunneling di servizi in stile RPC su HTTP - "Livello 0" nel numero article.

Io suggerirei qualcosa come il seguente come un ingenuo, non ipermedia (cioè "Livello 2") API:

  • per recuperare un elenco di informazioni di riepilogo di tutti i messaggi (in tutte le cartelle):

    GET /v1/messages HTTP/1.1 
    Host: api.mydomain.com 
    

    risposta:

    content-type: text/xml 
    
    <?xml version="1.0"?> 
    <messages> 
        <message subject="Subject" unread="true" id="1234" folder="inbox" /> 
        <message subject="Hello, world" unread="false" id="24" folder="inbox" /> 
        ... 
    </messages> 
    
  • di recuperare un messaggio completo:

    GET /v1/messages/1234 HTTP/1.1 
    Host: api.mydomain.com 
    

    Risposta:

    content-type: text/xml 
    
    <?xml version="1.0"?> 
    <message subject="Subject" unread="true" id="1234" folder="inbox"> 
        Hi, this is the message. 
    </message> 
    
  • Per modificare un messaggio (ad esempio, a segnare come letto e spostarlo nella cartella di archivio):

    POST /v1/inbox/messages/1234 HTTP/1.1 
    Host: api.mydomain.com 
    content-type: text/xml 
    
    <?xml version="1.0"?> 
    <message id="1234" unread="false" folder="archive" /> 
    

    Nota: qui sto intenzionalmente usando POST invece di PUT per indicare un aggiornamento parziale.

Altre cose che si distinguono come bisognose di attenzione sono: risposte

  • Hypermedia e multimediali tipi. Francamente questo è meglio spiegato da altri (ad esempio il libro REST In Practice o lo InfoQ Coffee Cup example dagli stessi autori), ma in breve le vostre risposte dovrebbero indicare al cliente quali altre azioni potrebbero essere possibili dalla risposta alla loro richiesta più recente e consentire loro per scoprire l'intera API da un singolo URI. Ad esempio, vi è un'implicazione delle raccolte di cartelle sopra. Se GET /v1/messages/1234 restituito:

    <message subject="Subject" unread="true" id="1234" folder="inbox" > 
        Message text here. 
    
        <link rel="folder" href="http://api.mydomain.com/v1/folders/inbox" /> 
    </message> 
    

    allora il cliente avrebbe un esempio concreto di un URI provare un OPTIONS su, e una buona idea di quello che potrebbe essere lì.

  • Codici di risposta e contenuto: 200 OK è ovvio. Rispondere con 403 Forbidden se l'utente non è autorizzato a visualizzare un particolare messaggio, 404 Not Found se l'ID messaggio non esiste. Ogni volta che restituisci un errore, dai al cliente alcune indicazioni su come correggere la richiesta (se possibile).