2012-04-13 26 views
6

chúng tôi hiện đang thiết kế một REST api bên trong. chúng tôi có các trường hợp sử dụng sau đây:Thiết kế REST API - truy vấn dữ liệu thư - chất độc nào để chọn?

  1. một người sử dụng (109) muốn đọc một thông điệp rằng ông đã gửi đến người dùng khác (110)
  2. người dùng đọc (109) được biết đến ứng dụng thông qua thẻ của mình thông tin mà ông nhận được sau khi chứng thực (trong khi làm theo yêu cầu GET)
  3. chúng tôi giả định trong ví dụ này sử dụng 109 là người gửi và 110 người nhận

để tóm tắt từ quan điểm người dùng "cho tôi qua đường bưu điện mà tôi (109) đã gửi đến 110 "

các URI sau đến tâm trí của chúng tôi nhưng chúng tôi không thể quyết định cái nào để thực hiện:

a) GET http://localhost:9099/api/mails/109?receiverUserId=110 
b) GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110 
c) GET http://localhost:9099/api/mails?receiverUserId=110 
d) GET http://localhost:9099/api/mails/me/to/110 (when logged in as 109 via token credentials we know that "me" is 109) 
f) GET http://localhost:9099/api/mails/109/to/110 (explicit request, e.g. for admins … has to be guarded against illegal access) 

tất cả các liên kết là "bối cảnh nhạy cảm" đang gửi một trong những liên kết đến các máy thu (110) sẽ mang lại kết quả khác nhau thực hiện yêu cầu GET.

tôi muốn biết ý kiến ​​của bạn về url cần sử dụng.

bất kỳ trợ giúp nào được đánh giá cao.

cổ vũ marcel

+0

Chỉ cần quan sát: (b) và (d) giống hệt nhau. – ArjunShankar

+0

ah xin lỗi, bạn đúng ;-) – Marcel

+1

Tôi bỏ phiếu cho c. Tôi không thấy điểm trong việc chỉ ra người đọc, vì nó được biết đến. (ngoại trừ bộ nhớ đệm, mặc dù) – njzk2

Trả lời

2

phản ứng khác nhau cho các khách hàng khác nhau, ví cùng URL là ổn.

StackExchange làm nó:

GET /me/comments/{toid} 

mà là tài liệu here.

Twitter làm nó quá:

GET /statuses/home_timeline 

mà là tài liệu here.

Cả hai URL đó đều phỏng đoán người dùng đã đăng nhập dựa trên xác thực. Có, nó đánh bại bộ nhớ đệm nếu người dùng chia sẻ bộ nhớ cache, nhưng IMO, điều này là không sao. Việc điều này có phá vỡ ràng buộc 'nhận dạng tài nguyên' của REST có thể gây tranh cãi hay không. Câu trả lời cho câu hỏi this và nhận xét tiếp theo ở đó cho tôi biết tại sao nó lại gây tranh cãi.

Trong thực tế, trong số các tùy chọn, bạn làm URL đề cập đến không phải là 'bối cảnh nhạy cảm':

GET /api/mails?senderUserId=109&receiverUserId=110 

này ai sẽ luôn luôn trở lại tin nhắn từ 109 đến 110. Nhưng trong khi một khách hàng muốn xem kết quả này khi xem tin nhắn 'đã gửi', người kia sẽ muốn xem kết quả này khi xem tin nhắn 'đã nhận'. Loại eh lạ? Ngoài ra, trên máy chủ, bạn sẽ phải kiểm tra xem người dùng đã được xác thực là 109 | 110, nếu không thì hãy ném 401 UNAUTHORIZED.

tôi sẽ đi với một cái gì đó như:

GET /mail/sent 

trả về tất cả gửi mail.Và:

GET /mail/sent?to=110 (like applying a 'filter' to /mail/sent) 
OR 
GET /mail/sent/110 (clean URL) 

lợi nhuận mail gửi đến 110.

+0

cảm ơn câu trả lời của bạn. tôi nghĩ rằng chúng tôi sẽ chọn một trong những liên kết được minh chứng. – Marcel

1

"Bối cảnh nhạy cảm" liên kết là ý tưởng tồi cho một REST của API (đặc biệt, điều này gây cản trở bộ nhớ đệm). Nếu bạn muốn chỉ sử dụng HTTP thì điều này là OK.

Vì vậy, tôi khuyên bạn nên sử dụng các URL không phụ thuộc vào người dùng hiện tại và giới hạn quyền truy cập vào các URL đó theo quy tắc của bạn.

0

Theo ý kiến ​​của tôi, bạn cần 2 lớp:

Một là lớp bên trong, không yêu cầu xác thực người dùng, chỉ có thể truy cập từ các thành phần bên trong. Nó bao gồm các API như

GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110

Ưu điểm của lớp này là testability, tái sử dụng và cachability.

Lớp khác là lớp bên ngoài, yêu cầu xác thực người dùng và có thể truy cập được từ khách hàng bên ngoài. Nó bao gồm các API như

GET http://localhost:9099/api/mails?receiverUserId=110.

Khách hàng phải đăng nhập để nhận thông tin xác thực mã thông báo, sau đó máy chủ có thể lấy thông tin người dùng từ mã thông báo này và ánh xạ cuộc gọi API bên ngoài đến cuộc gọi API nội bộ.

Bạn có thể có các loại phương thức xác thực khác nhau, nhưng lớp bên trong sẽ không bị thay đổi, bạn chỉ cần ánh xạ các lớp bên ngoài khác nhau cho lớp bên trong.

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