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

时间:2012-12-09 15:32:18

标签: java web-services http rest soa

我正在设计一个RESTful API。

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

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

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

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

或者像这样:

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

因为客户如何知道在逗号之前有productId和逗号之后的数量。

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

3 个答案:

答案 0 :(得分:5)

传递参数是一个想法:

/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);

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

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

答案 1 :(得分:2)

我会稍微扩展您的第二个建议,为产品的各个部分添加明确的名称,并使用分号代替逗号分隔产品属性,因为顺序无关紧要 *

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

请注意idqty如何切换第二个产品,因为属性的顺序无关紧要。

<小时/> * 当订单很重要时,有一个使用逗号的约定,当订单不重要时,使用分号。

答案 2 :(得分:0)

我认为最常用的HTTP GET方法:

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

最近我遇到了类似的情况,客户需要能够按为每个产品任意定义的“产品属性”进行搜索。客户还需要能够轻松地创建这些链接并通过电子邮件等传递它们。我不想创建自定义查询字符串,因为我不想创建自定义解析器,并且添加了一个额外的步骤,其中客户可能会犯错。而且我不想传递json,因为在某些情况下它依赖于Client来生成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

我将错误和索引范围检查留给读者练习。