2012-07-18 35 views
6

Chúng tôi có một ứng dụng được chia thành hai phần:REST của URI mẫu cho hoạt động truy vấn và Command

  1. Admin - Trong trường hợp dữ liệu bị thay đổi
  2. Công - Trường hợp dữ liệu được đọc

tôi đang xem xét việc tạo một API REST để cung cấp chức năng này. Rất dễ dàng để xem các hoạt động CRUD có thể được biểu diễn như thế nào nhưng tôi không chắc chắn về các hoạt động cụ thể (các lệnh) trên một tài nguyên riêng lẻ. Ví dụ: "Xuất bản" một số Project, chúng tôi gửi "PublishCommand". Chúng tôi không PUT đầy đủ Project quay lại máy chủ với thuộc tính Published được đặt thành true.

Trên một lưu ý tương tự, tôi hơi bối rối về cách chúng ta nên đại diện cho các hoạt động truy vấn nâng cao hơn trên tài nguyên mà không được phân loại là dịch vụ kiểu RPC.

Dưới đây tôi đã liệt kê các mẫu URI cho tài nguyên Project của mình. Tôi có đang đi đúng hướng để tạo một API RESTful thực sự không?

ADMIN API 
--------- 

// Project Resources 
GET /projects -- get all projects 
POST /projects -- create a new project 

// Project Resource 
GET /projects/10 -- get project with id 10 
PUT /projects/10 -- update project with id 10 
DELETE /projects/10 -- delete project with id 10 

// Project Resource Operations 
POST: /projects/10/publish -- publish project with id 10 
POST: /projects/10/unpublish -- unpublish project with id 10 
POST: /projects/10/setposition/2 -- move to position 2 in projects list 

// Project Sub resources (identity is local to project) 
POST: /projects/10/media -- adds media to project with id 10 
PUT: /projects/10/media/5 -- updates media id 5 for project id 10 
DELETE: /projects/10/media/5 -- deletes media id 5 from project id 10 

PUBLIC API 
---------- 

GET: /projects -- gets all projects (with default limit e.g. first 10) 
GET: /projects?skip=10&take=10 -- gets projects 11 to 20 
GET: /projects/tagged/rest OR /taggedprojects/rest -- gets projects tagged with "REST" 
GET: /projects?orderbydesc=publishdate OR /latestprojects -- gets latest projects 

GET: /projects/10 -- gets project with id 10 

Trả lời

5

Tôi không nghĩ rằng REST chỉ nhằm mục đích đại diện cho các hoạt động CRUD. Giao diện của bạn có vẻ ổn với tôi và tôi tin rằng bạn đang đi đúng hướng.

Có cuộc trò chuyện trực tuyến về DDD và REST: RESTful SOA or Domain-Driven Design - A Compromise? bởi Vaughn Vernon.

Cập nhật để bao gồm một bình luận tôi đã thực hiện dưới đây:

Bạn có thể truy vấn Yor đọc mô hình sử dụng GET. Để thay đổi miền của bạn, bạn có thể PUT hoặc POST tới các tài nguyên đại diện cho các lệnh. Điều này sẽ cung cấp sự phong phú của một mô hình miền vượt quá CRUD và vẫn sử dụng ngữ nghĩa vốn có của HTTP.

+0

Sẽ xem nội dung này. Nhưng hãy nhớ, sử dụng các động từ HTTP để truyền đạt hành động là một phần của REST http://martinfowler.com/articles/richardsonMaturityModel.html – Aliostad

+0

Cảm ơn Dennis. Đây chính là mối quan tâm của tôi - tôi không cần phải thỏa hiệp sự phong phú của mô hình miền của mình để tôi có thể cung cấp một API RESTful để nói chuyện với nó. –

+0

Bạn có thể yêu cầu truy vấn yor bằng cách sử dụng GET, và PUT hoặc POST cho các tài nguyên đại diện cho các lệnh.Điều này sẽ cung cấp sự phong phú của một mô hình miền vượt quá CRUD và vẫn sử dụng ngữ nghĩa vốn có của HTTP. Nhưng tôi biết rằng một số người không chia sẻ ý kiến ​​này. –

2

Nếu bạn nhìn vào xuất bản như một nguồn lực, sau đó bạn có thể sử dụng CRUD (POST/GET/PUT/DELETE):

  • POST để tạo ra một công bố, đi qua id dự án
  • DELETE để hủy xuất bản
  • NHẬN để truy xuất

Điều này không có nghĩa là quy trình phải được liên kết với việc tạo bản ghi vật lý trong cơ sở dữ liệu. Đó chỉ là cách tiếp cận dựa trên tài nguyên quan trọng.

+0

để chúng tôi BẬT/xuất bản dự án? Điều gì về những hoạt động đó không thực sự bản đồ ở tất cả các nguồn lực, chẳng hạn như lệnh "Di chuyển". –

+0

Tuy nhiên, bạn cần phải suy nghĩ về nó như một nguồn tài nguyên nếu bạn hoàn toàn tuân thủ REST. http://martinfowler.com/articles/richardsonMaturityModel.html – Aliostad

+1

Tôi không thấy làm thế nào điều này có thể cho mọi hoạt động xảy ra trong một tên miền vì một số thao tác không ánh xạ tới một tài nguyên (như ví dụ "Di chuyển"). –

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