重要提示:这个问题实际上并不是一个ASP.NET问题.任何对URL都有所了解的人都可以回答.我恰好使用ASP.NET路由,因此包含了这个细节.
简而言之,我的问题是:
"我应该设计哪种URL格式,我可以让外部各方到达我的网站上的特定位置,以便将来证明.[我是创建这些'REST'网址的新手]."
我需要一个ASP.NET路由URL,该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 } );
广告系列:可能不希望在实际链接中使用"广告系列"一词 - 因为用户会在网址栏中看到它.我可能会把它变成像'c'这样神秘的东西.
destination:指示我们网站上链接将用户带到哪个页面.例如PR将用户引导到产品页面.
partnerid:我们分配的公司的ID - 例如堆栈溢出的SO.
campaignid:广告系列ID,例如123 - 每个合作伙伴都是唯一的.我已经意识到,我认为我希望第三方公司能够自己管理广告系列ID,而不是我们提供一个网站来"制作广告系列".虽然我还不完全确定.
自定义:自定义数据(可选).我可以在不破坏现有URL的情况下添加更多自定义数据参数
注意:我有"目的地"的原因是因为广告系列ID是由客户决定的,因此他们还需要告诉我们该广告系列的目的地在哪里.或者,他们可以"注册"我们的活动.这可能是一个更好的解决方案,以避免人们放入随机的广告系列ID,但我并不过分担心,我认为这个系统提供了更大的灵活性.
此外,我们想知道他们用来链接我们的图像(因此我们可以跟踪哪个横幅效果最好).我认为这是一个新的竞选活动,而不是自定义数据领域,但我不确定.
目前我使用的是非常原始的URL,例如http://example.com?cid=123.在这种情况下,广告系列ID需要发布给第三方,它不是一个非常灵活的系统.我想立即转向新客户的新系统.
关于未来打样这个系统的任何想法?我可能错过了什么?我知道我总是可以添加新格式,但如果这是一个好主意我想尽可能多地使用这种格式.
这个网址:
"campaign/{destination}/{partnerid}/{campaignid}/{custom}",
...对我来说看起来不像是一个资源,它看起来像一个远程方法调用.这里有很多业务逻辑,可能会在未来发生变化.而且,它很复杂.设计URL时我的直觉就是更简单一些.将URL交给外部合作伙伴时,这会加倍.
统一资源定位器应该指定资源.目的地当然是一种资源(但稍后会更多关注这一点),我认为您可以将该活动视为一种资源.合作伙伴不是您所服务的资源.Custom当然不是资源,因为它完全未定义.
我听说你不想告诉合作伙伴"制作一个广告系列",但是考虑到你最终可能不得不走这条路.只要广告系列具有合作伙伴标识符以外的任何属性,您就必须执行此操作.
因此,我的第一个结论是,您应该摆脱合作伙伴ID,并从广告系列中获取.如果有必要,也可以删除自定义,并使用查询字符串参数.使用查询字符串参数来指定如何返回资源(而不是资源的标识)是合适的.
去除这些产量:
"campaign/{destination}/{campaignid}",
好的,这更简单,但看起来仍然不对.广告系列和广告系列ID之间的目的地是什么?一种方法是重新安排事情:
"campaign/{campaignid}/{destination}",
另一种方法是使用Astoria风格的索引:
"campaign({campaignid})/{destination}",
出于某种原因,对许多人来说这看起来很奇怪,但这完全合法.您可以随意使用其他合法字符将广告系列与ID分开; 这里的要点是a /不是唯一的选择,可能不是合适的选择.
然而...
我们尚未涉及的一个问题是,如果/当用户提交有效目的地,但无效的广告系列或合作伙伴ID时会发生什么.如果正确的响应是用户应该看到错误,那么上述所有内容仍然有效.另一方面,如果正确的响应是用户应该静默地被带到目标页面,那么广告系列ID实际上是查询字符串参数,而不是资源的一部分.也许有些合作伙伴不喜欢给出带有问号的URL,但从纯粹的REST角度来看,我认为这是正确的方法,如果广告系列ID的有效性无法确定用户的最终位置.在这种情况下,URL将是:
"campaign/{destination}",
...并且您将添加包含广告系列ID的查询字符串参数.
我意识到我没有给你一个明确的答案.麻烦的是,大多数情况都取决于您可能已经意识到的业务因素,但我当然不是.因此,我更倾向于涵盖REST-ful URL的理念,而不是试图向您解释您的业务.:)