在 GET 中为 REST 调用传递数组

我有一个 URL 来为这样的用户获取约会:

/user/:userId/appointments

如果我想为多个用户获得约会,URL 应该是什么样子的?

应该是:

/appointments?users=1d1,1d2..

谢谢, 克里斯。

177253 次浏览
/appointments?users=1d1,1d2..

这是唯一合理的选择,因为使用 GET 不能传入主体。

集合是一种资源,所以/约会可以作为资源。

集合通常还通过 querystring 提供过滤器,这实际上就是 users = id1,id2..。

那么,

/appointments?users=id1,id2

可以作为经过过滤的 RESTful 资源使用。

我认为更好的做法是序列化 REST 调用参数,通常采用 JSON 编码方式:

/appointments?users=[id1,id2]

甚至:

/appointments?params={users:[id1,id2]}

然后在服务器上对它们进行解码,从长远来看,这将给您带来更大的灵活性。

只要确保在发送参数之前也对它们进行 URLEncode!

不要使用 http GET,而是使用 http POST.andJSON 或 XML

这就是发送到服务器的请求流的样子。

POST /appointments HTTP/1.0
Content-Type: application/json
Content-Length: (calculated by your utility)


{users: [user:{id:id1}, user:{id:id2}]}

或者在 XML 中,

POST /appointments HTTP/1.0
Content-Type: application/json
Content-Length: (calculated by your utility)


<users><user id='id1'/><user id='id2'/></users>

您当然可以继续使用已经提出的 GET,因为它当然更简单。

/appointments?users=1d1,1d2

这意味着您必须保持数据结构非常简单。

但是,如果/当您的数据结构变得更加复杂,http GET 和没有 JSON,您的编程和识别数据的能力将变得非常困难。

因此,除非您能够保持数据结构简单,否则我建议您采用数据传输框架。如果您的请求是基于浏览器的,行业通常的做法是使用 JSON。如果您的请求是服务器-服务器的,那么 XML 是最方便的框架。

JQuery

如果您的客户端是一个浏览器,而您没有使用 GWT,那么您应该考虑使用 jquery REST。使用 jQuery 的谷歌 RESTful 服务。

这样做的另一种方法是一遍又一遍地重复相同的论点,这种方法取决于您选择的服务器架构/框架。就像这样:

/appointments?users=id1&users=id2

在这种情况下,我建议使用单数形式的参数名:

/appointments?user=id1&user=id2

这是由一些框架支持的,比如 Jersey (用于 Java)。

这招对我很管用。

/users?ids[]=id1&ids[]=id2