REST URL所需的建议将提供给第三方访问我的网站

时间:2009-01-30 20:56:43

标签: asp.net asp.net-mvc routing rest

重要提示:这个问题实际上并不是一个ASP.NET问题。任何对URL都有所了解的人都可以回答它。我恰好使用ASP.NET路由,因此包含了详细信息。

简而言之,我的问题是:

“我应该设计哪种网址格式,我可以让外部各方到达我网站上的特定地点,这将是未来的证据。[我是创建这些'REST'网址的新手]。”


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

除了trying to capture referrer我还需要收到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'这样神秘的东西。

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

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

campaignid :广告系列ID,例如123 - 每个合作伙伴都是唯一的。我已经意识到,我认为我希望第三方公司能够自己管理广告系列ID,而不是我们提供一个网站来“制作广告系列”。我不是  尽管如此,完全确定这一点。

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

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

此外,我们想知道他们用来链接我们的图像(因此我们可以跟踪哪个横幅效果最好)。我认为这是一个新的竞选活动,而不是自定义数据领域的候选人,但我不确定。

目前我使用的是非常原始的网址,例如http://example.com?cid=123。在这种情况下,广告系列ID需要发布给第三方,它不是一个非常灵活的系统。我想立即转向新客户的新系统。

对未来打样这个系统的想法?我可能错过了什么?我知道我总是可以添加新格式,但如果这是一个好主意我想尽可能多地使用这种格式。

9 个答案:

答案 0 :(得分:6)

此网址:

"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的理念,而不是试图向您解释您的业务。 :)

答案 1 :(得分:3)

我认为URL重写最近有点失控。并非所有内容都属于URL。毕竟,URL应该描述可以搜索,发现或操纵的资源,在我看来,至少合作伙伴ID和上面的自定义字段不属于资源。

更不用说在某些时候,您希望在多个广告系列中实际保持合作伙伴ID不变,这意味着它现在与他们需要访问的特定位置正交。如果您将这些作为参数保留,您将允许您的合作伙伴统一访问您网站上的多个资源,同时仍然可靠地识别自己,这样您就可以跟踪他们参与您的任何广告系列。

答案 2 :(得分:1)

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

{custom}

{*custom}

这样,如果您需要接受更多参数,则不必考虑旧URL将获得404.例如:

如果您的网址如下:

  

运动/ PR / SO / 123

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

  

运动/ PR / SO / 123 /嗒嗒/富

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

答案 3 :(得分:1)

为什么不使用URL编码变量而不是路由?它们更灵活 - 您可以在将来添加任何新功能,同时仍保持100%向后兼容性。不可否认,手动输入会有点麻烦,但如果还有所有这些参数,那就已经不是野餐了。

http://mysite.com/page?campaign=1&dest=products&pid=15&cid=25

对我而言,这更能说明实际情况。使用路径意味着该位置存在资源。但实际上,您只是提供具有各种参数的Web服务,而且此模型可以更清晰地捕获。在将来,您可以毫不费力地添加更多参数。如果缺少参数而不弄乱任何东西,也可以默认参数。

不确定ASP中的代码,但实现起来应该是微不足道的。

答案 4 :(得分:1)

我想我会按照SO提出问题的方式来做这件事。

"campaign/{campaign-id}/friendly-name-of-campaign"

创建广告系列时,在数据库中创建一个映射,将所需的所有数据与自动生成的ID相关联。友好名称的分配方式基本上与用户提出的问题相同 - 但您也可以通过批准流程确保其符合您的要求,并且不同于任何现有的广告系列名称。您的跟踪公司可以按ID进行跟踪,您可以通过简单的查找将其与关联数据相关联。

答案 5 :(得分:0)

你所拥有的东西看起来对你的需求有益。这里的其他帖子都有好处。但可能不适合你。你可以考虑将来证明你的链接的一件事是在那里的某个地方放一个版本号。

"campaign/{version}/{destination}/{partnerid}/{campaignid}/{custom}"

这样,如果您决定完全更改格式,则可以将版本升级到2.0(或其他任何版本)并仍然跟踪旧链接。

答案 6 :(得分:0)

我愿意

/c/{destination}/{partnerid}/{campaignid}/?customvar=s

你应该考虑第一个参数的层次结构,你已经得到了很好的管理。只有在存在层次结构路径时才应使用段。

根据您的描述,目标似乎是最广泛的参数,partnerid仅适用于目标,而Campaingid特定于合作伙伴。

当你真的需要添加自定义参数时,我会选择查询变量(它们在REST中不被禁止),因为它们不是层次结构的一部分。

你也不应该试图在这里过于RESTful。毕竟,它适用于广告系列和重定向到最终资源。因此,您要在此设计的URL实际上并不是REST中的特定资源。

答案 7 :(得分:0)

创建名为http://mysite.com/gateway

的网址

返回HTML表单,告诉您的合作伙伴填写表单并发布。根据表单值重定向。

您可以轻松地为您的合作伙伴提供javascript以执行GET和POST。应该是微不足道的。

答案 8 :(得分:0)

我学到的关于REST URL的最重要的事情通常是在一些书或文章中深深埋没:

URL应指向一个资源,以下内容?querystring应该包含所需的所有范围信息。不要将这两者混合在一起,否则你的设计将非常难以使用。

除此之外,我完全赞同Craig Stuntz