RESTful服务的url设计

Pan*_*kaj 8 java rest

我有一个Pricing我想要检索的资源.一个Offer可以具有定价和Promo可以有Pricing资源,有另一个实体CustomerPricing可映射.我想Pricing基于OfferId/ PromoId/ 之一检索CustomerId.

要为此设计URL,我遇到两个选项:

选项1:将其作为查询字符串传递

/pricing?OfferId=234&PromoId=345&CustomerId=543234
Run Code Online (Sandbox Code Playgroud)

选项2:有三个API

/pricing/offer?id=234
/pricing/promo?id=345
/pricing/customer?id=543234
Run Code Online (Sandbox Code Playgroud)

IMO,OfferId/ PromoId/ CustomerId应被视为资源的属性.因此将属性作为查询字符串传递.我更倾向于选项1.

选项2避免if else条件检索资源,看起来更干净,但它似乎支持REST设计的URL标准?

什么是设计URL的REST标准.你会推荐哪个选项?

Fre*_*dom 5

我更喜欢选项1.
选项2有以下缺陷:

  1. 它可能会使用户感到困惑.例如,/pricing/offer/234似乎代表Offer资源,而不是Pricing资源.
  2. 在业务逻辑中,Offer资源包含一个Pricing,但 /pricing/offer/234代表正确的方式.看起来Pricing资源包含Offer资源.

实际上,选项1也存在一些问题.例如,

/pricing?OfferId=234&PromoId=345&CustomerId=543234  
Run Code Online (Sandbox Code Playgroud)

会得到三个Pricings,对吗?它似乎

/pricings?OfferId=234&PromoId=345&CustomerId=543234  
Run Code Online (Sandbox Code Playgroud)

更合理.

您可以考虑的另一个选项是选项3:

/offer/234/pricing
/promo/345/pricing
/cusomer/543234/pricing
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助.


Wel*_*lsh 4

最干净且遵循标准路径的方式是:

/pricing/offer/234
/pricing/promo/345
/pricing/customer/543234
Run Code Online (Sandbox Code Playgroud)

布局为:/pricing/${offer|promo|customer|/${PathParamForId}

然后,您可以将其作为三种单独的方法,每种方法用于报价/促销/客户。

然后,您只需确保您的 API 有详细记录,以便用户了解路径的预期行为。(报价与促销查找之间的差异等)