如何为HTTP GET的多个Key-Value参数设计REST URI

jos*_*737 10 java rest soa web-services http

我正在设计一个RESTful API.

一项服务应为多个键值对提供查询功能.例如,客户端可以使用一个HTTP GET请求查询不同的产品和相关数量.

客户想要使用金额44和产品2查询产品1,金额为55.我实际上不希望我的URI看起来像这样:

/produkt?productId1=1&productquantity1=44&productId2=2&productquantity2=55
Run Code Online (Sandbox Code Playgroud)

因为我不知道有多少产品被查询.

或者像这样:

/produkt?product=1,44&product=2,55
Run Code Online (Sandbox Code Playgroud)

因为客户怎么能知道在逗号之前有productId和逗号之后的数量.

有没有人有其他解决方案?或者,提供使用一个请求查询多个产品的可能性是不是RESTful?是否更好地提供仅查询一个具有相关数量的产品的可能性,如果客户想要查询更多产品,他们应该发送更多请求?

Yog*_*ati 6

以下是传递参数的一个想法:

/products?productDetail=[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}]
Run Code Online (Sandbox Code Playgroud)

哪里

[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}]
Run Code Online (Sandbox Code Playgroud)

是的JSON表示List<kv>

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这样您就可以轻松地将查询参数转换productDetailList<kv>使用

new Gson().fromJson(productDetail,kv.class);
Run Code Online (Sandbox Code Playgroud)

比你可以轻松迭代所有元素.

另一个建议是,如果您不知道查询了多少产品,请使用此POST请求.


das*_*ght 2

我将通过为产品的各个部分添加明确的名称,并使用分号代替逗号来分隔产品属性来扩展您的第二个建议,因为顺序并不重要*

/products?id=1;qty=44&qty=55;id=2
Run Code Online (Sandbox Code Playgroud)

id请注意第二个产品中和 的切换方式qty,因为属性的顺序并不重要。


*有一个约定,当顺序很重要时使用逗号,当顺序不重要时使用分号。