12

我正在设计一个 RESTful API。

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

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

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

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

或者像这样:

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

因为客户怎么知道逗号之前是productId,逗号之后是数量。

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

4

3 回答 3

7

这是传递参数的一种想法:

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

}

因此您可以轻松地将查询参数转换productDetailList<kv>使用

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

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

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

于 2012-12-09T16:00:20.430 回答
2

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

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

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


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

于 2012-12-09T15:44:24.187 回答
0

我能想到的最惯用的 HTTP GET 方式:

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

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