web-dev-qa-db-ja.com

APIは常にJSONObjectまたはJSONArrayのベストプラクティスを返す

JSONでデータを返すAPIを作成しています。

クライアント側で、このAPIを呼び出すユーティリティクラスを作成することも望んでいました。

何かのようなもの :

JSONObject sendGetRequest(Url url);
JSONObject sendPostRequest(Url url, HashMap postData);

ただし、APIがオブジェクトの配列を返す場合があります[{id:1},{id:2}]

私は今4つの選択肢を得ました():

  • JSONArrayまたはJSONObjectのメソッドテストを行い、呼び出し元でキャストする必要があるObjectを送り返します
  • JSONObjectJSONArrayを返すメソッドを作成します(sendGetRequestAndReturnAsJSONArrayのように)
  • サーバーが1つの要素でも常にArraysを送信するようにする
  • サーバーが常にアレイをラップしてObjectsを送信するようにします

APIが一貫したタイプのデータを送信するように強制するのは良いことだと思うので、最後の2つのメソッドを選びます。

しかし、ベストプラクティスは何ですか(存在する場合)。

常に配列を送信しますか?または常にオブジェクトを送信しますか?

3

それは実際に何をしているのかによります。 1つ以上のオブジェクトを取得する場合、要素が1つだけの配列であっても、常に結果を含む配列を返すことは論理的に意味があります。これにより、たとえば、返された配列に対してforeachを簡単に実行できます。

ただし、リクエストの形式によって完全に異なる種類のデータが返される場合は、コンテキストごとに異なるメソッドを使用する方が明確です。

これがメソッドとしてどのように機能するかは、よく似ています。コレクションfooがあり、コレクションの要素を検索する関数searchFooがある場合、1つの要素のみが一致する場合は要素を返し、それ以外の場合は要素のリストを返すように記述しません。常に1つの要素のみが検索され(検索が一意のキーに基づく場合など)、その場合は適切なタイプのオブジェクトも返されます。または、要素の数が可変の場合は常にリストが返されます。 、見つかった要素の数に関係なく。

2
HamHamJ

このトピックはすでに終了している可能性がありますが、議論のために、ここでは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/

3
Wery Nguyen