JSONでデータを返すAPIを作成しています。
クライアント側で、このAPIを呼び出すユーティリティクラスを作成することも望んでいました。
何かのようなもの :
JSONObject sendGetRequest(Url url);
JSONObject sendPostRequest(Url url, HashMap postData);
ただし、APIがオブジェクトの配列を返す場合があります[{id:1},{id:2}]
私は今4つの選択肢を得ました():
JSONArray
またはJSONObject
のメソッドテストを行い、呼び出し元でキャストする必要があるObject
を送り返しますJSONObject
とJSONArray
を返すメソッドを作成します(sendGetRequestAndReturnAsJSONArray
のように)Arrays
を送信するようにするObjects
を送信するようにしますAPIが一貫したタイプのデータを送信するように強制するのは良いことだと思うので、最後の2つのメソッドを選びます。
しかし、ベストプラクティスは何ですか(存在する場合)。
常に配列を送信しますか?または常にオブジェクトを送信しますか?
それは実際に何をしているのかによります。 1つ以上のオブジェクトを取得する場合、要素が1つだけの配列であっても、常に結果を含む配列を返すことは論理的に意味があります。これにより、たとえば、返された配列に対してforeachを簡単に実行できます。
ただし、リクエストの形式によって完全に異なる種類のデータが返される場合は、コンテキストごとに異なるメソッドを使用する方が明確です。
これがメソッドとしてどのように機能するかは、よく似ています。コレクションfooがあり、コレクションの要素を検索する関数searchFooがある場合、1つの要素のみが一致する場合は要素を返し、それ以外の場合は要素のリストを返すように記述しません。常に1つの要素のみが検索され(検索が一意のキーに基づく場合など)、その場合は適切なタイプのオブジェクトも返されます。または、要素の数が可変の場合は常にリストが返されます。 、見つかった要素の数に関係なく。
このトピックはすでに終了している可能性がありますが、議論のために、ここでは10セントを考えます。私はjsonとWebサービスセキュリティで調査を行っています。json配列ではなく常にjsonオブジェクトを返す必要があると思います。これは、json配列を改ざんして、XSSスクリプトを返す可能性があるためです。例:配列の戻り値が
[1, alert('You are hacked!'), 'abc']
次に、通話が終了したときにどのような驚きが出ると思いますか?これは有効なJavaScript呼び出しとして扱うことができ、アラートを表示します。 jsonオブジェクトを返すと、これを防ぐことができます。
{'data':[1, alert('you are hacked', 'abc')]}
は無効なjsonデータであり、ブラウザーコンソールでエラーとして表示されるどちらのjsスクリプトでもありません。これが、asp.netからwebserviceを呼び出すと、常に「d」メンバーを持つjsonが返される理由です。
詳細: http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/