2013-06-23 32 views
5

Tôi có một dịch vụ REST xử lý các máy chủ video trên mạng.REST: truy cập các thành viên của một bộ sưu tập qua nhiều id

Mỗi máy chủ video có thể được xác định theo nhiều cách: theo số sê-ri, theo tên hoặc số máy của nó.

Để được trả lại một bộ sưu tập của tất cả các máy chủ có sẵn trên mạng của tôi, mọi thứ là khá đơn giản: Tôi đã xác định con đường sau:

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

và lớp yêu cầu sau đây:

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

Bây giờ, tôi muốn trả lại một máy chủ cụ thể từ bộ sưu tập của mình, xác định nó bằng số sê-ri của nó, bằng tên máy hoặc số máy của nó.

Để làm như vậy, tôi đã xác định các tuyến đường sau:

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

và lớp yêu cầu sau đây:

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

Vì vậy, tôi có thể truy cập vào bộ sưu tập máy chủ của tôi thông qua:

GET /servers 

và nhận một máy chủ cụ thể bằng cách sử dụng:

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

Đó có phải là cách phù hợp để tiếp tục không? Tôi có cảm giác rằng đây không phải là rất Nghỉ ngơi. Tôi có nên coi đây là tìm kiếm trong bộ sưu tập của mình thay vì sử dụng tài nguyên "nhân tạo" không?

Trả lời

2

Tôi sẽ đại diện cho dịch vụ theo một cách luôn là duy nhất (số sê-ri có thể chính xác).

Đối với truy vấn, tôi sẽ làm điều gì đó như /servers/?name=[name] hoặc /server/?id=[id] hoặc chỉ /servers/[serial] (nếu bạn muốn sử dụng số sê-ri trực tiếp). Khi yêu cầu tên hoặc id, bạn nên thay đổi url trong yêu cầu thành servers/[serial] để duy trì url duy nhất.

1

Tốt thôi, miễn là bạn chuyển hướng (3xx) hai trong số các URI của cái kia, thay vì trả về cùng một biểu diễn (2xx) cả ba. Nếu không, bạn sẽ có một thời gian để giữ các bản sao được đồng bộ trong bộ nhớ cache. Trong trường hợp của bạn, có vẻ hợp lý khi có các tài nguyên machinenumbers và machinenames chuyển hướng đến các tài nguyên máy chủ/{id}.

Nếu có bất cứ điều gì, đó là tìm kiếm chung bằng cách sử dụng các tham số k = v không giống với REST. Hãy nhớ rằng các tài nguyên nhận dạng của URI và các truy vấn là một phần của URI: các truy vấn khác nhau xác định các tài nguyên khác nhau. Vì tập hợp các thuật ngữ trong chuỗi truy vấn dạng biểu mẫu thường lớn (vì lợi ích thuận tiện) và các cụm từ có thể xuất hiện theo bất kỳ thứ tự nào, điều này gây ra sự bùng nổ tài nguyên tiềm năng (nếu bạn không có kế hoạch dựa vào bộ nhớ đệm cho hiệu quả, sau đó bạn có rất nhiều tùy chọn khác, nhưng đó không phải là REST).

2

Tôi tin đây là ServiceStack-way. Chỉ cần làm cho cả hai trường uint không thể thực hiện được như vậy trong quá trình triển khai dịch vụ, bạn chắc chắn tìm kiếm thông số nào theo.

Các vấn đề liên quan