代码之家  ›  专栏  ›  技术社区  ›  Simon_Weaver

需要就REST URL向第三方提供建议以访问我的网站

  •  2
  • Simon_Weaver  · 技术社区  · 16 年前

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


    trying to capture 这个 referrer 我需要收到合作伙伴ID、活动编号以及可能的其他参数。我想提供一种方法来做到这一点,但我想第一次就把它做好,因为很明显,一旦它被外部使用,我就很难改变它。

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

    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

    竞选活动

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

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

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

    目前,我使用的是一个非常原始的URL,例如 http://example.com?cid=123 在这种情况下,活动ID需要颁发给第三方,这不是一个非常灵活的系统。我想立即为新客户更换新系统。

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

    9 回复  |  直到 8 年前
        1
  •  6
  •   Craig Stuntz    16 年前

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

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

    资源

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

    所以我的第一个结论是,你可能应该去掉合作伙伴ID,并从活动中获得它。也要摆脱自定义,必要时使用查询字符串参数。使用查询字符串参数来指定如何返回资源(而不是资源的标识)是合适的。

    去除这些收益:

    "campaign/{destination}/{campaignid}",
    

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

    "campaign/{campaignid}/{destination}",
    

    "campaign({campaignid})/{destination}",
    

    出于某种原因,这对很多人来说看起来很奇怪,但这是完全合法的。请随意使用其他合法字符将活动与ID分开;这里的重点是a/不是唯一的选择,也可能不是合适的选择。

    然而。..

    我们还没有讨论的一个问题是,如果/当用户提交了一个有效的目的地,但一个无效的活动或合作伙伴ID时,会发生什么。如果正确的答案是用户应该看到一个错误,那么上述所有内容仍然有效。另一方面,如果正确的答案是用户无论如何都应该被静默地带到目标页面,那么活动ID实际上是一个查询字符串参数,而不是资源的一部分。也许有些合作伙伴不喜欢收到一个带有问号的URL,但从纯粹的REST角度来看,如果活动ID的有效性不能决定用户的最终去向,我认为这是正确的方法。在这种情况下,URL将是:

    "campaign/{destination}",
    

    我意识到我还没有给你一个明确的答案。问题是,这主要取决于你可能知道的商业考虑,但我当然不知道。因此,我更想介绍REST URL的理念,而不是试图向您解释您的业务。 :)

        2
  •  3
  •   Franci Penov    16 年前

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

        3
  •  1
  •   David Brown Muad'Dib    16 年前

    {custom}
    

    {*custom}
    

    如果你的URL看起来像:

    活动/PR/SO/123

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

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

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

        4
  •  1
  •   levand    16 年前

    为什么不使用URL编码变量而不是路由?它们要灵活得多——你可以在未来添加任何新功能,同时仍然保持100%的向后兼容性。诚然,手动输入有点麻烦,但如果有所有这些参数,那就不容易了。

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

    对我来说,这更能表明实际发生了什么。使用路径意味着资源存在于该位置。但实际上,你只是提供了一个具有各种参数的web服务,这个模型更清楚地捕捉到了这一点。在未来,您可以轻松添加更多参数。如果缺少默认参数,您也可以使用默认参数,而不会造成任何混乱。

    不确定ASP中的代码,但实现起来应该很简单。

        5
  •  1
  •   tvanfosson    16 年前

    我想我会以提问的方式看待这件事。

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

    在创建活动时,在数据库中创建一个映射,将您需要的所有数据与自动生成的id相关联。友好名称的分配方式基本上与SO上的问题相同——由用户分配——但您也可以有一个审批流程,确保它符合您的要求,并与任何现有的活动名称不同。您的跟踪公司可以通过id进行跟踪,您可以通过简单的查找将其与关联的数据相关联。

        6
  •  0
  •   Jeremy French    16 年前

    你所拥有的看起来很适合你的需求。这里的其他帖子都有很好的观点。但可能不适合你。在对链接进行未来验证时,您可以考虑在其中的某个位置放置一个版本号。

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

    这样,如果你决定完全改变你的格式,你可以将版本升级到2.0(或其他任何版本),同时仍然可以跟踪进来的旧链接。

        7
  •  0
  •   webjunkie    16 年前

    我会的

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

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

    根据你的描述,目的地似乎是最广泛的参数,partnerid只适用于目的地,campaigd是特定于合作伙伴的。

        8
  •  0
  •   Darrel Miller    16 年前

    创建一个名为的URL http://mysite.com/gateway

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

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

        9
  •  0
  •   LDomagala    16 年前

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

    除此之外,我完全同意Craig Stuntz的观点

    推荐文章