Asp.net 需要向第三方提供有关REST URL的建议以访问我的网站

Asp.net 需要向第三方提供有关REST URL的建议以访问我的网站,asp.net,asp.net-mvc,routing,rest,Asp.net,Asp.net Mvc,Routing,Rest,重要提示:这个问题实际上不是ASP.NET问题。任何了解URL的人都可以回答。我只是碰巧在使用ASP.NET路由,所以包含了这个细节 简言之,我的问题是: “我应该设计什么样的URL格式,让外部各方可以访问我网站上的某个特定位置,这将是未来的证明。[我不熟悉创建这些“REST”URL]。” 我需要一个ASP.NET路由URL,将提供给第三方跟踪营销活动。它本质上是一个“网关”URL,将用户重定向到我们网站上的特定页面,可能是主页、特殊比赛或特定产品 除此之外,我还需要收到partnerId、活

重要提示:这个问题实际上不是ASP.NET问题。任何了解URL的人都可以回答。我只是碰巧在使用ASP.NET路由,所以包含了这个细节

简言之,我的问题是:

“我应该设计什么样的URL格式,让外部各方可以访问我网站上的某个特定位置,这将是未来的证明。[我不熟悉创建这些“REST”URL]。”


我需要一个ASP.NET路由URL,将提供给第三方跟踪营销活动。它本质上是一个“网关”URL,将用户重定向到我们网站上的特定页面,可能是主页、特殊比赛或特定产品

除此之外,我还需要收到partnerId、活动编号以及可能的其他参数。我想提供一个途径来做到这一点,但我想得到正确的第一次,因为显然我不能轻易改变它一旦被外部使用

像这样的东西看起来怎么样

routes.MapRoute(
   "3rd-party-campaign-route",
   "campaign/{destination}/{partnerid}/{campaignid}/{custom}",
   new
   {
       controller = "Campaign",
       action = "Redirect",
       custom = (string)null // optional so we need to set it null 
   }
); 
活动:可能不希望在实际链接中使用“活动”一词,因为用户会在URL栏中看到它。我可能会把它改成像“c”这样神秘的东西

目的地:指示链接将把用户带到我们网站上的哪个页面。例如,PR将用户引导到产品页面

partnerid:我们为公司分配的ID-例如堆栈溢出

活动id:活动id,如123-每个合作伙伴都是唯一的。我已经意识到,我想我更希望第三方公司能够自己管理活动ID,而不是我们提供一个网站来“创建活动”。我不是 不过,我还是完全肯定这一点

自定义:自定义数据(可选)。我可以在不破坏现有URL的情况下添加更多自定义数据参数

注意:我之所以有“目的地”,是因为活动ID由客户决定,所以他们还需要告诉我们该活动的目的地在哪里。或者,他们可以向我们“注册”一项活动。这可能是一个更好的解决方案,以避免人们在随机的活动ID,但我并不过分担心这一点,我认为这个系统提供了更多的灵活性

此外,我们还想知道他们使用了哪些图像链接到我们(这样我们就可以跟踪哪个横幅效果最好)。我认为这是一个新的活动ID,而不是一个自定义的数据字段,但我不确定

目前,我正在使用一个非常原始的URL,例如。在这种情况下,活动ID需要发给第三方,这不是一个非常灵活的系统。我想立即为新客户使用新系统


关于这个系统的未来证明有什么想法吗?我可能错过了什么?我知道我可以随时添加新格式,但如果这是一个好主意,我希望尽可能多地使用此格式。

看起来您已经涵盖了所有基础。我唯一的建议就是改变

{custom}

这样,如果您需要接受进一步的参数,您就不必冒着旧URL会得到404的风险。例如:

如果您的URL看起来像:

运动/PR/SO/123

您决定将来接受第四个和第五个参数:

活动/PR/SO/123/blah/foo

那么第一个URL仍然有效,因为您在{*custom}中使用了通配符。“blah/foo”将作为字符串传递给您的操作。要获得这两个额外的参数,只需将操作中的自定义参数拆分为“/”。添加一些友好的错误处理,如果它们不存在,并且您已成功更改了活动URL可接收的信息量,而没有完全破坏已存在的URL。

此URL:

"campaign/{destination}/{partnerid}/{campaignid}/{custom}",
…在我看来,它不像是一个资源,而是一个远程方法调用。这里有很多业务逻辑,将来可能会发生变化。而且,这很复杂。我在设计URL时的直觉是,通常越简单越好。当您将URL传递给外部合作伙伴时,这会加倍

统一的资源定位器应该指定资源。目的地当然是一种资源(但更多的是在这一点上),我认为你可以认为这项运动是一种资源。合作伙伴不是您所服务的资源。自定义当然不是资源,因为它完全没有定义

我听到你说的不想告诉合作伙伴“创建一个活动”,但考虑到你最终可能不得不沿着这条路走下去。只要活动具有除合作伙伴标识符以外的任何属性,您就必须这样做

因此,我的第一个结论是,您可能应该删除合作伙伴ID,并从活动中获得它。如果有必要,也不要使用自定义,而是使用查询字符串参数。可以使用查询字符串参数指定如何返回资源(与资源的标识相反)

除去这些收益:

"campaign/{destination}/{campaignid}",
好吧,这比较简单,但看起来还是不对。在活动和活动ID之间,目的地在做什么?一种方法是重新安排事情:

"campaign/{campaignid}/{destination}",
另一种方法是使用Astoria风格的索引:

"campaign({campaignid})/{destination}",
出于某种原因,很多人觉得这很奇怪,但这完全是合法的。可以随意使用其他合法字符将活动与ID分开;这里的要点是a/不是唯一的选择,也可能不是合适的选择

但是…

我们还没有讨论的一个问题是,如果/当用户提交一个有效的目的地,但是一个无效的活动或合作伙伴ID时,会发生什么。如果正确的回答是用户应该看到一个错误,那么以上所有的都是错误的
"campaign({campaignid})/{destination}",
"campaign/{destination}",
"campaign/{version}/{destination}/{partnerid}/{campaignid}/{custom}"
http://mysite.com/page?campaign=1&dest=products&pid=15&cid=25
"campaign/{campaign-id}/friendly-name-of-campaign"
/c/{destination}/{partnerid}/{campaignid}/?customvar=s