L'API Sun Cloud a http://kenai.com/projects/suncloudapis/pages/Home è un buon esempio da seguire per un'API RESTful. Fedele ai principi RESTful, quando OTTIENI una risorsa non ottieni né più né meno una rappresentazione di quella risorsa.Mimetypes per un'API RESTful
L'intestazione Content-Type nella risposta indica esattamente il tipo di tale risorsa, ad esempio application/vnd.com.sun.cloud.Snapshot + json. Sun ha registrato questi mimetipi con lo IANA.
Quanto è pratico questo in generale al momento? La maggior parte delle API che ho visto hanno utilizzato il Content-Type di "application/json". Questo ti dice che la risposta è JSON ma niente di più. Devi avere qualcosa nell'oggetto JSON, come una proprietà di "tipo", per sapere di cosa si tratta.
Sto progettando un'API RESTful (che non sarà resa pubblica, quindi non registrerei i mimetypes). Ho usato RESTEasy e trovo che anche se specifichi un mimetype completo, il Content-Type nell'intestazione della risposta sarà esattamente ciò che l'intestazione della richiesta Accept ha specificato. Se la richiesta richiede "application/* + json", per impostazione predefinita l'intestazione della risposta avrà "application/* + json". Posso probabilmente sistemarlo cambiando l'intestazione prima che la risposta si spenga, ma dovrei provare a farlo? O la risposta dovrebbe avere un carattere jolly come ha fatto la richiesta?
Oppure devo semplicemente pubblicare "application/json" come la maggior parte delle API sembrano fare?
pensieri supplementari aggiunti successivamente:
Un altro modo per affermare la domanda è: Devo usare HTTP come protocollo, o dovrei usare HTTP solo come un meccanismo di trasporto per avvolgere il mio protocollo?
Per utilizzare HTTP come protocollo, il corpo dell'entità della risposta contiene la rappresentazione dell'oggetto richiesto (o la rappresentazione di un oggetto messaggio di errore), l'intestazione "Content-Type" contiene il tipo esatto dell'oggetto, e l'intestazione "Stato" contiene un codice di successo o di errore.
Per utilizzare HTTP come semplice meccanismo di trasporto, l'intestazione "Status" è sempre impostata su 200 OK, il "Content-Type" è qualcosa di generico come "application/json" e il corpo dell'entità contiene qualcosa che ha esso stesso un oggetto, un tipo di oggetto, un codice di errore e qualsiasi altra cosa desideri. Se il tuo protocollo è RESTful, allora l'intero schema è RESTful. (HTTP è un protocollo RESTful ma non l'unico possibile.)
Il proprio protocollo sarà opaco a tutti i livelli di trasporto. Se si utilizza HTTP come protocollo, tutti i livelli di trasporto lo capiranno e potrebbero fare cose che non si desidera; ad esempio un browser intercetterà una risposta "401 non autorizzata" e aprirà una finestra di dialogo di accesso, anche se si vuole gestirlo da soli.
Un problema che sto riscontrando con un client Web è l'intercettazione da parte del browser di codici di stato e intestazioni HTTP. Ad esempio, se si restituisce un oggetto non autorizzato 401, il client JavaScript non lo vede prima che il browser lo impugna e apre la propria finestra di accesso. Da quel momento in poi il browser mette la propria intestazione di autorizzazione su ogni richiesta. I Mimetipi passano attraverso OK ma almeno un codice di stato (401) è un problema. –