API RESTful có nên cung cấp dữ liệu cho toàn bộ biểu mẫu không?


13

Giả sử tôi có một ứng dụng web JavaScript hoàn toàn sử dụng API RESTful cho dữ liệu.

Giả sử ứng dụng này có dạng dữ liệu và giả sử tôi đang chỉnh sửa bản ghi tại / sản phẩm / 12345. Khi xây dựng biểu mẫu, tôi thực hiện một yêu cầu RESTful tới / sản phẩm / 12345 và nhận dữ liệu JSON:

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27
}

Vì vậy, hình thức của tôi rõ ràng có thể có một danh sách thả xuống để chọn một người bán hàng. Tôi cần phải điền vào danh sách này. Dữ liệu nên đến từ đâu? Cách tiếp cận phổ biến nhất là gì?

Nó có ý nghĩa để làm cho nó trở thành một phần của phản hồi yêu cầu / sản phẩm / 12345 không?

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27,
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ]
}

Còn khi tạo một bản ghi mới thì sao? API của tôi cũng nên phản hồi với GET / sản phẩm / mới, với điều sau đây?

{
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ],
  "categories": [
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
  ],
  "etc": [ ... ]
}

xin vui lòng không bao giờ sử dụng yêu cầu GET để tạo một cái gì đó. Điểm cuối của bạn phải là / sản phẩm không / sản phẩm / mới . Để tạo một sản phẩm mới, bạn nên gửi yêu cầu PUT đến điểm cuối đó.
Kerem Baydoğan

Điều này không tạo ra bất cứ điều gì. Đây hoàn toàn là một yêu cầu cho dữ liệu hiện có hoặc một mẫu cho một bản ghi mới, chưa được lưu.
Chad Johnson

oh xin lỗi, bây giờ tôi hiểu ý của bạn một trong hai cách sản phẩm không nên chịu trách nhiệm cung cấp sản phẩm mẫu hoặc danh sách giá trị cho các danh sách thả xuống của mẫu tạo sản phẩm. như @Dan nói chỉ cần tạo các điểm cuối riêng biệt và sử dụng các tiêu đề bộ đệm để trình duyệt của bạn có thể lưu các giá trị thả xuống cho hiệu suất.
Kerem Baydoğan

Câu trả lời:


6

Tôi nghiêng về phía các điểm cuối rất đơn giản, tập trung hẹp. Tôi sẽ mong đợi một yêu cầu tại một số địa điểm như / sales_users trả về tất cả người dùng bán hàng.

NHẬN / sales_users:

[
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
]

Tương tự, nếu bạn sắp có một danh sách các danh mục, tôi sẽ thêm một điểm cuối riêng cho điều đó.

NHẬN / danh mục:

[
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
]

Tôi sẽ không xây dựng một GET / sản phẩm / mới. Thay vào đó, tôi sẽ xây dựng một biểu mẫu trong ứng dụng của bạn để xử lý việc thêm các sản phẩm mới biết các yêu cầu phù hợp để điền vào danh sách của nó (ví dụ: GET / loại, GET / sales_users, v.v.).


3

Giả sử rằng danh sách nhân viên bán hàng tương đối tĩnh, tôi sẽ nghĩ rằng bạn muốn có một cuộc gọi API riêng /salesusersmà bạn có thể gọi một lần (khi tải biểu mẫu, v.v.) và lưu lại để bạn không phải yêu cầu lại dữ liệu này thời gian. Hãy nhớ trong REST, bạn đang tổ chức API của mình xung quanh các tài nguyên và nhân viên bán hàng là các tài nguyên tách biệt về mặt logic với các sản phẩm.

Tương tự như vậy, khi gọi /product/new, bạn chỉ muốn gửi dữ liệu cho một sản phẩm mới, có thể bao gồm id sales_user, nhưng không có gì hơn. Thay đổi đối với sales_user sẽ là một cuộc gọi riêng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.