Tôi đang cố gắng thiết kế một API web RESTful cho dịch vụ của chúng tôi bằng ASP.NET Web API. Tôi đang gặp rắc rối với việc tìm ra cách để định tuyến các hành động không CRUD đến hành động điều khiển thích hợp. Giả sử tài nguyên của tôi là một cánh cửa. Tôi có thể làm tất cả những thứ CRUD quen thuộc với cánh cửa của tôi. Hãy nói rằng mô hình cho cửa của tôi là:Cách định tuyến các hành động không phải CRUD trong một API Web RESTful ASP.NET?
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
tôi có thể làm tất cả các hoạt động CRUD tiêu chuẩn của tôi qua api web của tôi:
POST: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors/1234
GET: http://api.contoso.com/v1/doors?InsideRoomName=Cafeteria
PUT: http://api.contoso.com/v1/doors/1234
DELETE: http://api.contoso.com/v1/doors/1234
và vân vân. Nơi tôi gặp rắc rối là khi tôi cần phải mô hình hóa các hành động không phải CRUD chống lại cánh cửa của tôi. Tôi muốn mô hình hóa một động từ Khóa và Mở khóa đối với tài nguyên của mình. Đọc qua ASP.NET articles hướng dẫn có vẻ là chuyển sang cuộc gọi kiểu RPC khi sử dụng các tác vụ tùy chỉnh. Điều này mang lại cho tôi một con đường:
PUT: http://api.contoso.com/v1/doors/1234/lock
PUT: http://api.contoso.com/v1/doors/1234/unlock
Điều này có vẻ mâu thuẫn với tinh thần của REST nhằm mục đích cho đường dẫn chỉ ra tài nguyên. Tôi cho rằng tôi có thể mô hình động từ như một nguồn lực:
POST: http://api.contoso.com/v1/doors/1234/lockrequests
POST: http://api.contoso.com/v1/doors/1234/unlockrequests
Trong trường hợp này, tôi vẫn có thể sử dụng khuyên {controller}/{id}/{action} nhưng nó có vẻ như tôi vẫn đang tạo ra một hỗn hợp RPC/REST API. Có thể, hoặc thậm chí được đề xuất như xa như giao diện REST đi, để đặt các hành động tùy chỉnh trong danh sách các thông số?
PUT: http://api.contoso.com/v1/doors/1234?lock
PUT: http://api.contoso.com/v1/doors/1234?unlock
tôi có thể thấy trước một nhu cầu để có cuộc gọi này được hỗ trợ với các tham số truy vấn là tốt, chẳng hạn như:
PUT: http://api.contoso.com/v1/doors?lock&InsideRoomName=Cafeteria
Làm thế nào tôi sẽ tạo ra con đường để lập bản đồ yêu cầu này để DoorsController của tôi?
public class DoorsController : ApiController
{
public IEnumerable<Doord> Get();
public Door Get(long id);
public void Put(long id, Door door);
public void Post(Door door);
public void Delete(long id);
public void Lock(long id);
public void Unlock(long id);
public void Lock(string InsideRoomName);
}
tôi có thể làm cho một số giả định sai ở đây liên quan đến những gì được và không phải là thông lệ tốt nhất liên quan đến thiết kế REST API, vì vậy bất kỳ hướng dẫn có được đánh giá là tốt.
Google sử dụng API REST với Blogger, kiến nó sử dụng các hành động trong REST! https://developers.google.com/blogger/docs/3.0/reference/posts/publish – padibro