5

我有一个 REST 服务处理网络上的视频服务器。

可以通过多种方式识别每个视频服务器:序列号、名称或机器编号。

为了返回我网络上所有可用服务器的集合,事情非常简单:我定义了以下路由:

[Route("/servers", "GET")]

和以下请求类:

public class ServerCollection : IReturn<List<ServerDto>>
{
    ...
}

现在,我想从我的集合中返回一个特定的服务器,通过它的序列号、它的机器名称或它的机器号来识别它。

为此,我定义了以下路线:

[Route("/servers/{SerialNumber}", "GET")]
[Route("/servers/machinenumbers/{MachineNumber}", "GET")]
[Route("/servers/machinenames/{MachineName}", "GET")]

和以下请求类:

public class Server : IReturn<ServerDto>
{
    public uint SerialNumber { get; set; }
    public uint MachineNumber { get; set; }
    public string MachineName { get; set; }
}

因此,我可以通过以下方式访问我的服务器集合:

GET /servers

并使用以下任一方法获取特定服务器:

GET /servers/3
GET /servers/machinenumbers/42
GET /servers/machinenames/supercalifragilisticexpialidocious

这是正确的方法吗?我觉得这不是很 RESTful。我是否应该将此视为在我的收藏中进行搜索而不是使用“人工”资源?

4

3 回答 3

2

我相信这是 ServiceStack 的方式。只需使这两个uint字段都可以为空,以便在服务实现中确定搜索的参数。

于 2013-06-25T07:57:35.300 回答
2

我会以一种始终唯一的方式表示服务(序列号可能是正确的)。

对于查询,我会做类似/servers/?name=[name]/server/?id=[id]或只是/servers/[serial](如果你想直接使用序列号)。请求名称或 ID 时,您应该更改请求中servers/[serial]的 url 以保持 url 唯一。

于 2013-06-23T11:48:27.550 回答
1

没关系,只要您将(3xx)两个 URI 重定向到另一个,而不是在所有三个中返回相同的表示(2xx)。否则,您将花费大量时间在缓存中保持副本同步。在您的情况下,将 machinenumbers 和 machinenames 资源重定向到 servers/{id} 资源似乎是合乎逻辑的。

如果有的话,它是使用与 REST 对立的 k=v 参数的通用搜索。请记住,URI 标识资源,而查询字符串是 URI 的一部分:不同的查询字符串标识不同的资源。由于表单样式查询字符串中的术语集通常很大(为了方便起见),并且术语可以以任何顺序出现,这会导致潜在资源的爆炸(如果您不打算依赖缓存效率,那么您还有很多其他选择,但这不是 REST)。

于 2013-06-23T14:39:03.360 回答