偏离ASP.NET MVC的{controller} / {action} / {id} REST URL格式的缺陷?

时间:2009-03-09 06:32:31

标签: asp.net-mvc rest

我将很快推出一个新网站。该网站的一部分包含产品。

我目前正在尝试在ASP.NET路由的不同URL之间做出决定:

**产品:**

 /products/1001
 /products/sku/1001
 /products/product/1001
 /products/view/1001

**分类:**

 /products/category/cats
 /products/category/clothing

 /products/cats         - this is pretty nasty
 /products/clothing

我主要是在决定采用以下哪一项。 我目前正在做第一个。

  routes.MapRoute(
    "product-route-short",
    "products/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

  routes.MapRoute(
    "product-route-short",
    "products/sku/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

或以下

之一
 * call the action 'sku' , 'details' , 'item'
 * use an [ActionName] attribute and leave the action method name as 'ViewProduct'

我非常喜欢/products/1001的简单性,所以用户可以看到它并进行更改 - 但如果我不小心,很快就会有与其他操作冲突的危险。我还必须确保在创建我的URL时使用'product-route-short',这是一个非常小的痛苦。

有什么人想到的?你有什么最佳实践?这个例子非常简单,但我希望在整个网站上保持一致,并且一旦Google已经为我索引了所有内容,就不希望改进所有内容。

如果有关于该主题的任何特别好的播客或文章(一般或特定于ASP.NET),我会很感激与它们的链接。我找到了一个很好的播客,他们特别说的一件事是“这个播客不是关于如何创建好的REST链接”

3 个答案:

答案 0 :(得分:4)

我会将我的网址设定为这些目标...

1)可用性。如果你能看出你在查看URL时会得到什么样的页面,那真是太好了。如果它足够短,可以输入和/或猜测,那就更好了。

2)搜索引擎。您确实希望将关键字放入这些网址中。我知道您想使用ID来查找产品,但是人类和搜索引擎希望在那里看到产品名称。此外,关键词越接近URL的开头,就越重视它。

这真的只是一个撇脂。如果您需要最佳网址,您需要确保类别和产品名称是唯一的,以便您可以查找它们而不是在地址中使用ID。

我建议的惯例是......

/产品/

/产品/服/

/产品/服/蓝绒面鞋/

答案 1 :(得分:1)

请注意,SO本身会在stackoverflow.com/questions/625213上列出此问题(后面的/忽略)。所以你至少有先例:)。

答案 2 :(得分:1)

我认为您制作的较短网址很好。 asp.net mvc路由引擎的优点在于,假设您已在视图中正确地建立了链接,您可以在开发时对路径进行更改。所以随时随地玩耍。

要记住的另一件事是MapRoute方法中的constraints参数。你可以尝试这样的事情:

routes.MapRoute( 
"product-route-short", 
"products/{sku}", 
new { controller = "Products", action = "ViewProduct", sku = "1001" } , 
new { sku = @"[0-9]" } 
);

routes.MapRoute( 
"product-route-other", 
"products/{action}/id", 
new { controller = "Products", action = "ViewProduct" } 
);

该过滤器将使它只有0-9之间的skus才能工作。显然,您希望使用正则表达式来适应您的特定场景,但这可以帮助您避免与操作冲突。在这种情况下,如果sku的值不在0-9之间,则路由引擎将转到下一个路由并尝试匹配。它会在找到匹配项之前执行此操作。

通过路由和约束的组合,您应该能够拥有对用户有意义的非常干净的URL。