12

私はRESTfulAPIを設計しています。

1つのサービスが、複数のキーと値のペアに対してクエリ機能を提供する必要があります。たとえば、クライアントは1つのHTTP GETリクエストで、さまざまな製品と関連する数量を照会できます。

クライアントは、金額が44の製品1と金額が55の製品2を照会したいと考えています。実際、URIを次のようにしたくありません。

/produkt?productId1=1&productquantity1=44&productId2=2&productquantity2=55

クエリされる製品の数がわからないためです。

またはこのように:

/produkt?product=1,44&product=2,55

クライアントは、コンマの前にproductIdがあり、コンマの後に数量があることをどのようにして知ることができるのでしょうか。

誰か他の解決策がありますか?または、1つのリクエストで複数の製品をクエリする可能性を提供することはRESTfulではありませんか?関連する数量を使用して1つの製品のみを照会する可能性を提供し、クライアントがより多くの製品を照会する場合は、より多くの要求を送信する必要がありますか?

4

3 に答える 3

7

パラメータを渡すための1つのアイデアは次のとおりです。

/products?productDetail=[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}]

どこ

[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}]

List<kv>クラスのJSON表現です

class kv {
    String key;
    String value;


    public kv(String key, String value) {
        super();
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

productDetailしたがって、クエリパラメータを次のように簡単に変換できList<kv>ます

new Gson().fromJson(productDetail,kv.class);

すべての要素を簡単に繰り返すことができるよりも。

もう1つの提案は、クエリされる製品の数がわからない場合は、POSTこのリクエストを使用することです。

于 2012-12-09T16:00:20.430 に答える
2

製品のパーツに明示的な名前を追加し、順序は重要ではないため、コンマの代わりにセミコロンを使用して製品の属性を区切ることにより、2番目の提案を少し拡張します*

/products?id=1;qty=44&qty=55;id=2

属性の順序は重要ではないため、2番目の製品のidとがどのように切り替えられるかに注意してください。qty


*順序が重要な場合はコンマを使用し、順序が重要でない場合はセミコロンを使用する規則があります。

于 2012-12-09T15:44:24.187 に答える
0

私がそれを行うと考えることができる最も慣用的なHTTPGETの方法:

/produkt?productId=1&productquantity=44&productId=2&productquantity=55

私は最近、クライアントが製品ごとに任意に定義された「製品属性」で検索できる必要があるという同様の状況に遭遇しました。クライアントは、これらのリンクを簡単に作成し、電子メールなどで渡すことができる必要もありました。カスタムパーサーを作成したくなかったため、カスタムクエリ文字列を作成したくありませんでした。クライアントは間違いを犯す可能性があります。また、jsonはクライアントに依存してそのJSONを生成する場合があるため、jsonを渡したくありませんでした。

HTTP仕様は、パラメーターごとに複数の値に対して厳しいスタンスをとっていませんが、私が見つけることができるすべての例は、順序が保持されていることを示しています。Javaの例:

String[] productIds = this.request.getParameterValues("productId");
String[] productQuantities = this.request.getParameterValues("productquantity");

productIds[0]; // 1
productQuantities[0]; // 44
productIds[1]; // 2
productQuantities[1]; // 55

エラーとインデックス範囲のチェックは、読者の練習問題として残しておきます。

于 2020-09-28T23:15:45.190 に答える