我正在设计一个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?是否更好地提供仅查询一个具有相关数量的产品的可能性,如果客户想要查询更多产品,他们应该发送更多请求?
答案 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>
类
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
请注意id
和qty
如何切换第二个产品,因为属性的顺序无关紧要。
<小时/> * 当订单很重要时,有一个使用逗号的约定,当订单不重要时,使用分号。
答案 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
我将错误和索引范围检查留给读者练习。