Я создаю v2 существующего веб-API RESTful.
Ответы - это списки объектов в формате JSON, примерно в виде:
[
{
name1=value1,
name2=value2,
},
{
name1=value3,
name2=value4,
}
]
Одна проблема, с которой мы столкнулисьv1 заключается в том, что некоторые клиенты получают доступ к полям по целочисленной позиции, а не по имени.Это означает, что если мы решим добавить поля к ответу (который мы изначально рассматривали как изменение, сохраняющее совместимость), то часть кода нашего клиента нарушится, если мы не добавим поля в конце.Даже в этом случае код других клиентов в любом случае нарушается, потому что они каким-то образом потерпят неудачу при обнаружении неожиданного имени атрибута.
Чтобы противостоять этому в v2, мы рассматриваем случайное изменение порядка полей в каждом ответе.Это заставит клиентов индексировать поля по имени, а не по позиции.
Кроме того, мы рассматриваем добавление поля со случайным именем в каждый ответ.Это заставит клиентов игнорировать поля, которые они не распознают.
Хотя это звучит несколько странно, у него есть преимущество в том, что мы сможем добавлять новые поля, будучи уверенными, что это не нарушаетлюбые клиенты.Это означает, что мы можем выпускать совместимые обновления для v2.1, v2.3 и т. Д. По одному и тому же URL, и это означает, что нам нужно будет поддерживать и поддерживать только меньшее количество версий API.
Альтернативой являетсявыпускать несовместимые версии v3, v4 по новым URL-адресам, что означает, что нам придется поддерживать и поддерживать множество несовместимых версий API, что сделает нас немного тоньше.
Это плохая идея, и еслитак зачем?Есть ли другие подобные идеи, о которых мне следует подумать?
Обновление: Первая пара ответов указывает на то, что если я задокументирую проблему (т.е. укажите в документах, что поля могут быть добавлены)или переупорядочить), то я больше не виноват, если клиентский код ломается, когда я впоследствии добавляю или переупорядочиваю поля.К сожалению, я не думаю, что это подходящий вариант для нас: многие десятки организаций полагаются на функциональность наших API для реальных транзакций с существенными финансовыми последствиями.Эти организации не являются технически ориентированными - и полученные реализации на стороне клиента охватывают весь спектр технических знаний.Мы уже сделали документ, подтверждающий, что поля могут быть добавлены или переупорядочены в документах для v1, и это явно не сработало, потому что теперь нам приходится выпускать v2, потому что многие клиенты из-за нехватки времени илиопыт или способность, все еще писал код, который ломается, когда мы добавляем новые поля.Если бы я сейчас добавил поля к интерфейсу, это сломало бы нам дюжину различных интерфейсов компании, что означает, что они (и мы) теряют деньги каждую минуту.Если бы я отказался отменить изменение или исправить его, сказав «Они должны были прочитать документы!», То я скоро уйду с работы, и это правильно.Мы можем попытаться обучить «провалившихся» партнеров, но это обречено на провал, так как проблема с каждым месяцем увеличивается, по мере того, как мы продолжаем расти.Мой вопрос заключается в том, могу ли я системно устранить всю проблему на проходе, не допуская возникновения этой ситуации, независимо от того, что пытаются сделать клиенты?Если методы, которые я предлагаю, будут работать, почему я не должен их использовать?Почему никто не использует их?