2012-05-01 41 views
6

Cân nhắc người dùng (/ users/{id}) có tên và nhiều địa điểm (/ users/{id}/locations).Trong các Dịch vụ Web RESTful, các Response DTO có chứa các DTO con của chúng không?

Khi tôi yêu cầu người dùng (/ người dùng/{id}), người dùng đó phải được đại diện đầy đủ - id, tên và vị trí của nó - hoặc chỉ nên trả về các địa điểm theo yêu cầu riêng biệt? Ví dụ: bạn mong đợi DTO JSON nào theo yêu cầu cho người dùng có id = 123 (/ người dùng/123):

1) {"id": 123, "name": "Peter", "locations": [{"id": 1, "name": "Chicago"}, {"id": 2, "name": "New York"}]}

2) {"id": 123, "name ":" Peter "," vị trí ": [{" id ": 1}, {" id ": 2}]}

3) {" id ": 123," name ":" Peter "," địa điểm ": [1, 2]}

4) { "id": 123, "tên":" Peter"}

đây có phải là chủ quan hơn, đẩy và kéo giữa kích thước của DTO và yêu cầu bắt buộc trong trường hợp sử dụng điển hình? Tôi chỉ muốn bao gồm tất cả dữ liệu có liên quan (1), nhưng tôi không chắc chắn điều đó tốt hơn là chỉ yêu cầu nhà phát triển thực hiện nhiều lệnh gọi API để nhận được tất cả dữ liệu họ thực sự muốn.

+1

Bất kỳ lý do tại sao bạn không thêm một tham số truy vấn để bật/tắt danh sách các bộ sưu tập phụ yếu tố? Điều đó sẽ không khác gì khi thêm một?format = {json | xhtml} để điều chỉnh định dạng đầu ra ... – ScottCher

+0

Chủ yếu là do thời gian phát triển; Tôi không muốn giới thiệu những bổ sung không mong muốn hoặc không cần thiết. Tôi chỉ muốn làm những điều "đúng" hoặc ít nhất là trong một thời trang hợp lý, nhanh chóng. –

Trả lời

3

Để được yên tĩnh bạn không nhất thiết phải trả lại đại diện đầy đủ của tài nguyên Tuy nhiên, bạn muốn bật hypermedia làm phương tiện để lấy/đặt tất cả thông tin mà người dùng API của bạn cần (Hypermedia làm công cụ của trạng thái ứng dụng - aka HATEOAS)

Để thỏa mãn điều đó, bạn có thể sử dụng đề xuất của @bowmanb để p ut a URI cho tất cả các vị trí hoặc thêm URI riêng lẻ cho từng vị trí. Bạn có thể muốn thêm các URI bổ sung cho các tùy chọn khác để làm điều gì đó với tài nguyên.

Có một bài viết tốt về HATEOAS bởi Jim Webber, Savas Parastatidis & Ian Robinson gọi "how to GET a cup of coffee"

2

Tôi là một người mới trong thế giới này, nhưng tôi đang xây dựng một api an toàn và đối diện chính xác cùng một vấn đề. Công việc ban đầu của tôi đã hướng tới bao gồm mọi thứ - vì vậy kết quả của tôi trông giống như lựa chọn của bạn (1). Trong thực tế, tôi đi xa hơn một chút và bao gồm một URI với từng đối tượng để, theo lý thuyết, phản ứng có thể được điều hướng bởi một khách hàng đủ thông minh.

Có nói rằng, tôi đã thấy rằng một thuộc tính cụ thể của tôi tương đương với đối tượng "người dùng" của bạn là rất lớn. Nó dường như không ảnh hưởng đến hiệu suất, nhưng có vẻ như với tôi rằng không có khách hàng nào muốn tất cả thông tin đó về thuộc tính cụ thể đó - hầu hết khách hàng chỉ muốn tên và id. Vì vậy, tôi sẽ sửa đổi cách tiếp cận mặc định của tôi cho thuộc tính đó.

Tóm lại - theo ý kiến ​​của người mới - đó là quyết định được thúc đẩy bởi việc sử dụng dự kiến ​​của khách hàng của bạn - khách hàng muốn xem điều gì?

1

Có một số cách để khách hàng xác định cách tìm vị trí của người dùng. Vì vậy, tôi sẽ loại trừ số 4.

Nếu bạn lo lắng về kích thước của trả lời của bạn, tôi tin rằng nó vẫn sẽ được yên tĩnh để chỉ bao gồm URI đến các địa điểm của người dùng:

{ "id":123, "name":"Peter", "locations":"https://stackoverflow.com/users/123/locations" } 
+0

Sau đó, có lẽ, bộ sưu tập các vị trí của bạn sẽ là các tham chiếu URI riêng lẻ cho từng vị trí? ví dụ:/locations/{locationid} – ScottCher

+0

Đó là những gì tôi đang nghĩ. Nếu vị trí của người dùng quan trọng đối với dịch vụ và kích thước của phản hồi không phải là mối quan tâm, tôi sẽ bao gồm mọi thứ trong phản hồi/người dùng/{id}, bao gồm URI (như @Arnon Rotem-Gal-Oz đã nói). '{" id ": 123," tên ":" Peter "," vị trí ": [{" id ": 1," name ":" Chicago "," uri ":"/users/123/locations/1 " }, {"id": 2, "tên": "New York", "uri": "/ người dùng/123/vị trí/2"}]} ' – anon