2013-06-09 2 views

ответ

0

Правило, часто выступающее за API REST, заключается в том, что каждый ресурс должен иметь ровно один URI и что HTTP-заголовки должны использоваться для согласования того, как к нему нужно обращаться или манипулировать. Тем не менее, есть место для обсуждения того, как вы определяете, что представляет собой отдельный ресурс, и что представляет собой просто другое представление этого ресурса.

В вашем примере можно утверждать, что каждый город является ресурсом, но переводы данных об этом городе представляют собой представление. Это предполагает, что URL всегда должен быть http://example.com/city/boston, с выбранным языком, используя заголовок HTTP Accept-Language.

Альтернативная интерпретация заключается в том, что на самом деле вы представляете несколько API-интерфейсов, каждая из которых локализована целиком, поэтому http://example.com/en/ является базовым URL-интерфейсом API для английского языка, а http://example.com/de/ является базовым URL-адресом для API-интерфейса Германии, который, как представляется, обеспечивает аналогичный доступ к те же ресурсы. Это означает, что два API не нужно синхронизировать и могут быть адаптированы к их предполагаемой аудитории; в частности, он предположил бы, что http://example.com/de/stadt/Boston был лучшим URL-интерфейсом в немецком API.

Помните также, что имена самих ресурсов могут иметь локализованные эквиваленты, а не только такие типы ресурсов, как «город», поэтому, если города действительно были вашим типом вашего ресурса, http://example.com/en/city/Vienna будет соответствовать http://example.com/de/stadt/Wien. Это аккуратно понятное для человека, но может оказаться сложным встраивание в базовую модель данных.

Если ваше намерение состоит в том, чтобы представить один и тот же контент на максимально возможном количестве языков, то удаление локали из URL целиком и использование согласования контента через Accept-Language будет выглядеть более «RESTful». Если у вас есть отдельный английский и немецкий рынок, который может не требовать того же контента и функциональности, локализация URL-адресов, похоже, имеет смысл.

+0

Если вы согласны с тем фактом, что ресурс должен иметь только один URI, который возвращает 200, тогда становится легко отличить то, что является ресурсом, чем представление. Отдельный URI, который возвращает 200, всегда указывает на отдельный ресурс.Поэтому '/ city/boston' и'/en/city/boston' и '/ de/stadt/boston' являются тремя различными ресурсами. Только используя серверный conneg, ресурс может предоставлять разные представления для одного и того же ресурса. –

+0

@DarrelMiller Это хорошее * post facto * определение того, что * является * ресурсом, но при разработке API вы должны решить, какой * должен быть * ресурс. Если вы создаете URL-адрес типа '/ de/stadt/boston', вы утверждаете, что в вашей модели данных это отдельный ресурс от'/en/city/boston'; вопрос становится, является ли это подходящей моделью данных ... – IMSoP

+0

Согласовано. Я по-прежнему считаю это полезным определением, которое помогает предотвратить попадание людей в ресурс в ловушку сущности домена. –

0

Там нет такого понятия, как RESTful URL. Оба набора URI полностью действительны. Выберите, что лучше для вашей серверной платформы. Я предполагаю, что это будет второй.

+0

Является ли это действительным, а также: http://example.com/city/Boston и http://example.com/stadt/Boston? – lewicki

+0

@lewicki Против какого стандарта вы ожидаете «действительного» для оценки? Что касается того, является ли это «мудрым», я бы сказал «нет» - если вы попытаетесь угадать язык по слову «город», у вас будут проблемы, когда два языка используют одно и то же слово. – IMSoP

+0

@lewicki Оба являются допустимыми URI, REST не имеет никакого мнения о том, как выглядят ваши URI. Я подозреваю, что вы можете задать какой-то другой вопрос дизайна, который подразумевается вашей структурой URI, но я не хочу пытаться угадать, что это такое. –

Смежные вопросы