Ви описали два ефективні способи запиту декількох мов. Або має добре працювати. Я вибрав би явний параметр запиту мови для власного коду.
TL; DR Історія
Є заголовок мови . Зауважте, Accept
ні Accepted
. Це стандартна частина узгодження вмісту HTTP. Відповідь, як правило, повертає заголовок мови вмісту назад.
Accept-Language
це вступна пропозиція, що пропонує набір варіантів; Content-Language
- це резолюція із зазначенням обраної мови. Більшість Content-Language
відповідей повертає одну мову, але є можливість надати розділений комами список мов відповідей. Зазвичай це буде змішаним змістом, але немає причин, щоб він не міг сигналізувати про кілька непересічних альтернатив. Якщо ви хочете, щоб клієнт запросити всі доступні мови, вже є підстановлювальний варіант запиту, *
.
Отже, вже є механізм заголовка HTTP, який ви можете використовувати. Однак майте на увазі, що ви будете підробляти переговорний процес, який частіше представляє безліч можливих варіантів і отримує назад один варіант. Ви б змістили сенс на "ось список варіантів, дайте мені їх усі!" Якщо ви з цим все гаразд, у вас є рішення.
Однак існує значна дискусія щодо придатності сигналізації параметрів API REST в заголовках HTTP. Це трохи схоже на те, щоб зайти в ресторан і розмити детальне замовлення господареві чи майору, а не чекати появи офіціанта чи офіціантки. Це може працювати і може працювати добре, наприклад, якщо замовлення, спрямоване на господаря, стосується напоїв або закусок - речі, які хост може швидко побачити або швидко повідомити на ваш сервер. Але це також може розглядатися як порушення протоколу, адресованого на неправильному рівні / шарі або неправильному гравцеві.
Другою альтернативою буде явний параметр запиту. Ви пропонуєте ?all_languages=true
. Це здається надто специфічним. Щось на кшталт lang=en,fr,es
(дозволити кілька перерахованих мов) або lang=*
абоlang=all
(вказати кожну доступну мову) здається більш загальним. Це може бути виражено або в URL-адресі, або в органі запиту.
У будь-якому випадку, ваш багатомовний відповідь може бути легко закодований у повернене корисне навантаження JSON:
[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
{ "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
...
]
Зрештою, будь-який із цих підходів повинен вам добре працювати. Будь-яке може розглядатися як "послідовний, добре структурований дизайн RESTful API". Визначення того, що краще, ґрунтується, головним чином, на вашому ставленні до доцільності підбору (та трохи змінивши типовий сенс) заголовків переговорів щодо вмісту HTTP.
Моє власне вподобання - не перемішувати заголовки та інші параметри як рівні частини запиту API. Явний lang
або language
параметр мені здається більш чистим. Але так як HTTP дієслово (наприклад GET
, PUT
, POST
, PATCH
, ...) є частиною заголовка, а також має важливе значення для / перемішано з інтерпретацією запиту, я визнаю , конверт проти змісту відмінності трохи штучний і нечіткий. Як і у більшості дизайнерських рішень, справжні експерти відповідають на це по-різному, і YMMV.