Come indicare a un server Web la lingua di una risorsa

3

Sto scrivendo un'API HTTP su un server di pubblicazione e voglio risorse con rappresentazioni in più lingue. Un utente il cui cliente ottiene una risorsa che ha coreano, giapponese e trad. Le rappresentazioni cinesi e invia Accept-Language: en, ja;q=0.7 dovrebbero ottenere il giapponese.

Una risorsa, identificata da un URI, avrà quindi un numero di rappresentazioni linguistiche differenti. Questo mi sembra un uso totalmente ortodosso della negoziazione del contenuto e di rappresentazioni multiple di risorse.

Ma quando ogni traduttore arriva a fornire queste rappresentazioni linguistiche alternative al server, qual è il modo corretto di istruire il server su quale lingua memorizzare la rappresentazione? Sto facendo tradurre i traduttori nella sua interezza allo stesso URI, ma non riesco a scoprire come farlo in modo elegante. Content-Language è un'intestazione di risposta e nessuna delle intestazioni di richiesta sembra adattarsi alla fattura.

Sembra che le mie opzioni siano

  1. Inventa una nuova richiesta di intestazione
  2. Fornisci metadati aggiuntivi in un documento multipart / correlato
  3. Fornisci la lingua come parametro per il Content-Type della richiesta, come Content-Type: text/html;language=en

Non voglio entrare nel business dell'estensione di HTTP, e non mi sento particolarmente a mio agio nel mettere insieme metadati extra nella rappresentazione. Né l'approccio sembra amichevole con le cache HTTP. Quindi l'opzione 3 sembra il modo migliore a cui possa pensare, ma anche in questo caso è decisamente fuori standard inserire i miei parametri specifici su un tipo di contenuto ben definito.

Esiste un modo per raggiungere questo obiettivo?

    
posta Nik M 17.03.2014 - 00:11
fonte

2 risposte

1

Prima di tutto, diamo un nome alla tua risorsa: chiamiamola pubblicazione . Questo significa disambiggerlo da un altro tipo di risorsa che il tuo design sta implicando: la traduzione .

In secondo luogo, accettiamo il fatto che una raccolta di risorse è anche una risorsa stessa . Detto questo, una pubblicazione mi sembra più una raccolta di traduzioni.

Terzo, usare PUT per creare una traduzione mi sembra inappropriato, perché PUT è usato per sostituire una risorsa con un'altra. Avrebbe senso se ci fosse già una traduzione in una lingua specifica e il traduttore la aggiornasse. Ma per crearne uno nuovo, penso che POST si adatti meglio.

EDIT : ho ripensamenti su quanto sopra. Sembra che, poiché l'id della nuova risorsa viene decisa dal client, un PUT sarebbe effettivamente appropriato dopo tutto. Forse qualcun altro potrebbe fornire un'opinione più concreta sull'argomento.

Ora, considerando quanto sopra, una struttura uri come /publication/XYZ/en avrebbe sicuramente senso, perché farebbe riferimento a la traduzione inglese della pubblicazione con id XYZ . Questo risolve la creazione / l'aggiornamento / eliminazione delle traduzioni (utilizzando POST / PUT / DELETE resp.), Mentre durante una richiesta GET di /publication/XYZ puoi esaminare l'intestazione Accept-Language e rendere il client reindirizzare di conseguenza.

OTOH, la tua domanda afferma chiaramente che vuoi trattare la pubblicazione come una singola risorsa. In tal caso, suppongo che tu debba trattare le traduzioni come attributi separati (cioè i campi) della stessa risorsa. Proprio come una risorsa persona avrebbe un nome, un cognome e un'e-mail, una pubblicazione potrebbe avere una data di pubblicazione, una traduzione inglese e una giapponese.

Ma dovresti trovare un modo per aggiornare parzialmente la pubblicazione quando è necessario creare / modificare una traduzione. Immagino che una richiesta di PATCH sia appropriata per questo scenario.

    
risposta data 27.03.2014 - 17:25
fonte
1

Puoi trovare alcune linee guida sulla progettazione di URI per supportare risorse multilingue qui:

Inoltre, ecco in che modo l'API di Google Maps consente ai consumatori di specificare una lingua:

<script src="http://maps.google.com/maps/api/js?sensor=false&amp;language=ru-RU"type="text/javascript"></script> 

Nota il parametro URL alla fine: language=ru-RU

Nota:vienefattoriferimentoaquestadomandaStackOverflow:

  • Come indicare la lingua in Google Maps API?
risposta data 17.03.2014 - 17:20
fonte

Leggi altre domande sui tag