如何处理Web应用程序和RESTful API中的合并对象/资源?

时间:2010-07-13 06:01:34

标签: language-agnostic web-applications rest

我有一个Web应用程序,其中包含许多页面,其中包含/ object_type / object_id /形式的URL,用于显示此对象的详细信息。我还有一个RESTful API,返回我的对象​​的JSON / XML表示(在/ api / object_type / object_id /下)。 (我的目标是法律和法案,但我想这个问题相当通用)。

我不时发现我的两个或两个以上的对象实际上是重复的,并描述了现实世界中的同一个对象。让我们说他们是/ Bill / 111 /和/ Bill / 222 /。在幕后我合并了2个对象,留下1个对象(比如/ Bill / 111 /)和所有信息,另一个“空”只引用另一个。

我的问题是,我应该如何在网络应用和API中指明合并?我不希望/ Bill / 222 /返回404,因为我可能有外部链接指着它,我不想让它们破碎。我应该永久使用301 Moved吗?我应该返回一个正常页面(状态为200),说明该资源被检测为重复,并带有指向合并的资源的链接吗?我应该如何在API中处理这个问题?例如,我应该在Bills索引中列出222吗?

2 个答案:

答案 0 :(得分:2)

我想我会在这种情况下使用301,并且会在列表中停止包含222。 301的唯一原因是某些客户已将URL加入书签。

答案 1 :(得分:1)

@Darrel Miller:

  

我想我会在这种情况下使用301,并且会在列表中停止包含222。 301的唯一原因是某些客户已将URL加入书签。

我只想补充说系统应该接受/ Bill / 222和/ Bill / 111的链接作为等价物,即给用户编辑/ Joe / 999表示/ Bill / 222是Joe的朋友:

PUT /Joe/999
Content-Type: vnd.xxx+xml

<name is-friend-of="/Bill/222">Joe</name>

这应该在语义上与befriending / Bill / 111完全相同,实际上在发出上述PUT之后,当我收回它时,我看到链接变为111,我不会感到惊讶。