既存のRESTfulWebAPIのv2を作成しています。
応答は、オブジェクトのJSONリストであり、大まかに次の形式です。
[
{
name1=value1,
name2=value2,
},
{
name1=value3,
name2=value4,
}
]
v1で観察された問題の1つは、一部のクライアントが名前ではなく整数の位置でフィールドにアクセスすることです。これは、応答にフィールドを追加することを決定した場合(当初は互換性を維持する変更と見なしていた)、最後にフィールドを追加しない限り、クライアントのコードの一部が壊れることを意味します。それでも、他のクライアントのコードは、予期しない属性名に遭遇すると何らかの方法で失敗するため、とにかく壊れます。
v2でこれに対抗するために、すべての応答でフィールドをランダムに並べ替えることを検討しています。これにより、クライアントは位置ではなく名前でフィールドにインデックスを付けるように強制されます。
さらに、すべての応答にランダムな名前のフィールドを追加することを検討しています。これにより、クライアントは認識できないフィールドを無視するようになります。
これはやや厄介に聞こえますが、新しいフィールドを追加できるという利点があります。これにより、クライアントが破損することはありません。これは、同じURLでv2.1、v2.3などに互換性のある更新を発行できることを意味します。つまり、少数のAPIバージョンを維持およびサポートするだけで済みます。
別の方法は、互換性を破るv3、v4を新しいURLで発行することです。これは、互換性のない多くのAPIバージョンを維持およびサポートする必要があることを意味します。これにより、少し薄くなります。
これは悪い考えですか?もしそうなら、なぜですか?私が考えるべき他の同様のアイデアはありますか?
更新:最初のいくつかの応答は、問題を文書化した場合(つまり、フィールドが追加または並べ替えられる可能性があることをドキュメントに示した場合)、後でフィールドを追加または並べ替えたときにクライアントコードが壊れても責任を負わないことを指摘しています。残念ながら、これは私たちにとって適切なオプションではないと思います。何十もの組織が、実質的な経済的影響を伴う実際のトランザクションのためにAPIの機能に依存しています。これらの組織は技術指向ではありません。クライアント側での実装は、技術的な熟練度の全範囲をカバーします。私たちはすでにしましたv1のドキュメントでフィールドが追加または並べ替えられる可能性があり、明らかに機能しなかったというドキュメント。時間、経験、能力の不足により、多くのクライアントがまだ壊れたコードを記述しているため、v2を発行する必要があるためです。新しいフィールドを追加するとき。私が今インターフェースにフィールドを追加するとしたら、それは私たちへの十数の異なる会社のインターフェースを壊します、それは彼ら(そして私たち)が毎分お金を出血させていることを意味します。「彼らはドキュメントを読むべきだった!」と言って、変更を元に戻すことや修正することを拒否した場合、私はすぐに仕事を辞めます。「失敗した」パートナーを教育しようとするかもしれませんが、私たちが成長し続けるにつれて問題が毎月大きくなるため、これは失敗する運命にあります。私の質問は、パスで問題全体を体系的に先送りし、この状況が発生するのを防ぐことができるかということです。クライアントが何をしようとしても?私が提案するテクニックがうまくいくのなら、なぜ私はそれらを使うべきではないのですか?なぜ他のみんながそれらを使用しないのですか?