RESTful API та i18n: як спроектувати відповідь?


15

Ми розробляємо API RESTful, який в основному призначений для задоволення потреб одного клієнта. Через свої особливі обставини, цей клієнт повинен зробити якомога менше запитів.

API обробляє i18n за допомогою заголовка мови Accept у запитах. Це працює для всіх речей, які повинен зробити клієнт, за винятком однієї функції, у якій клієнт повинен зберігати відповіді на запит до однієї кінцевої точки у всіх доступних місцях.

Чи можемо ми якось розробити API таким чином, щоб клієнт міг захопити всю цю інформацію одним запитом і не порушувати послідовний, добре структурований дизайн RESTful API?

Варіанти, які ми розглядали досі:

  • Дозволення включення декількох локалів у заголовок Accept-Language та додавання локалізованих версій для всіх запитуваних локалів у відповіді, кожна з яких ідентифікується кодом мови ISO 639-1 як ключовим.
  • Створення чогось на кшталт параметра "? All_languages ​​= true" для цієї кінцевої точки та повернення локалізованих версій для всіх доступних локалів у відповіді, якщо цей параметр присутній.
  • (Якщо жоден з перерахованих вище для нас не працює), що робить кілька запитів, щоб схопити всі локалізовані версії від клієнта.

Яка з них найкраща альтернатива?

Відповіді:


22

Ви описали два ефективні способи запиту декількох мов. Або має добре працювати. Я вибрав би явний параметр запиту мови для власного коду.

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.


Їх відповідь була дуже навчальною та інформативною. Дякую. Дякуємо також за те, що помітили те, що не приймається. Це правильно в нашому коді, але тоді я не зміг використати належний термін при написанні поста. Я його модифікую для подальших посилань.
AMM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.