Tôi sẽ hỏi câu hỏi này theo cách này - những lo ngại về công nghệ phần mềm khi không triển khai API REST của tôi theo cách "đúng" là gì?
Bạn có ý nghĩa gì về cách "đúng"? Chà, cho phép tôi giải thích nhận thức của mình về cách đúng đắn, sau đó tôi sẽ cho bạn biết tôi đang làm như thế nào (cũng vậy, giả sử tôi đang nói về API JSON REST).
Đúng cách
Không quốc tịch. Đây là phần tôi nhận được. Khách hàng duy trì trạng thái luôn luôn 100% thời gian mãi mãi. Đó không phải là công việc của máy chủ, đó là của khách hàng.
Các hành động và phản ứng dự kiến cho mỗi động từ:
- NHẬN - Nhận toàn bộ tài nguyên được chỉ định toàn bộ, chỉ bị giới hạn bởi ủy quyền trong yêu cầu hoặc tham số truy vấn. Điều này đảm bảo không sửa đổi bất kỳ tài nguyên nào trong quy trình.
- POST - Đưa ra toàn bộ mô tả tài nguyên (như đối tượng JSON), tạo tài nguyên, sau đó trả về tài nguyên đó, với bất kỳ thuộc tính phía máy chủ nào cũng được tạo, chẳng hạn như ngày hoặc ID.
- XÓA - Xóa một tài nguyên đã chỉ định, chỉ cung cấp một số loại 200 OK làm phản hồi
- PUT - Đưa ra toàn bộ khai báo đối tượng làm đầu vào, cập nhật tài nguyên tại một vị trí cụ thể, cập nhật tất cả các trường của tài nguyên cho từng trường được đưa ra trong đầu vào. Để rõ ràng, điều này hy vọng toàn bộ đối tượng sẽ được thông qua dưới dạng đầu vào. Toàn bộ tài nguyên cập nhật được trả về, với tất cả các trường (theo ủy quyền hoặc bất kỳ cờ đầu vào nào khác).
- VĂN BẢN - Chỉ đưa ra các trường mong muốn được sửa đổi cho tài nguyên, chỉ cập nhật các trường trong tài nguyên đã chỉ định được cung cấp làm đầu vào. (Đây là nơi tôi không rõ ràng): Toàn bộ tài nguyên được trả lại? (Hay đó chỉ là các lĩnh vực được cập nhật? Dunno. Đừng quan tâm.)
- Đường dẫn tài nguyên. Với mối quan hệ của các tài nguyên với nhau, một đường dẫn tài nguyên có thể trông giống như một trong:
- / Parentresource /: id
- / Parentresource /: id / childresource
- / Parentresource /: id / childresource /: childId
- / Parentresource /: id / childresource /: childId / subresource /: subresourceId (Trong ví dụ này, nguồn con thuộc về nguồn con, thuộc về tài nguyên gốc).
Cách tôi muốn làm
Trên đây là sự hiểu biết của tôi về cách API REST hoạt động. Bây giờ hãy để tôi liệt kê một số biến thể của tôi ở trên:
- PUT / PATCH - Điểm vượt qua trong toàn bộ tài nguyên để sửa đổi là gì? Tôi chỉ sử dụng PUT để sửa đổi tài nguyên và tôi chỉ chuyển vào các trường tôi muốn được cập nhật. Do đó, tôi không có nhu cầu sử dụng VÒI
Đường dẫn tài nguyên - Tôi sử dụng GUID trong ứng dụng của mình. Kết quả là, chúng sẽ là duy nhất trên toàn cầu. Tại sao tôi cần đường dẫn tài nguyên đầy đủ, bao gồm cả tài nguyên gốc, nếu tôi chỉ có thể tham chiếu duy nhất một nguồn cung cấp phụ? Giống như:
/ subresource /: subresourceId
Nếu tôi được làm điều đó một cách "đúng", cố gắng để tham khảo các subresource sẽ đòi hỏi một đường dẫn đầy đủ như:
/ parentresource /: id / childresource /: childId / subresource /: subresourceId
là tất cả những gì cần thiết ? Bởi vì bây giờ tôi phải xử lý lỗi bổ sung nếu đường dẫn của tôi chứa một: subresourceId không thực sự thuộc sở hữu của một: childId và ditto cho một: childId không thuộc sở hữu của cha mẹ: id. Phía máy chủ của tôi đang chăm sóc ủy quyền tài nguyên. Tôi không thể chỉ tham khảo tài nguyên, chứ không phải là đường dẫn đầy đủ?Các phản ứng trở lại. Ví dụ, giả sử cấu trúc dữ liệu của tôi là một cây phân cấp, không có giới hạn thực tế về độ sâu của cây. Tài nguyên nằm ở các cấp độ khác nhau trên cây, theo kiểu phân cấp.
- NHẬN là rõ ràng. Nếu tôi nhận được toàn bộ cây này, tôi mong đợi toàn bộ cây là một phản hồi, với các tài nguyên được chứa trong các tài nguyên.
- Nếu tôi POST để tạo tài nguyên mới, PUT để cập nhật hoặc XÓA để xóa, tôi muốn xem deltas trong cây, thay vì chỉ nhìn thấy tài nguyên mà tôi đã tạo / cập nhật / xóa. Tôi không muốn phải gọi lại GET của cây mẹ sau mỗi lần POST, PUT hoặc DELETE, đặc biệt là nếu có ít thay đổi đối với cây và tôi chỉ muốn nhìn thấy vùng đồng bằng.
Hy vọng câu hỏi của tôi là rõ ràng.
Nếu bạn đã thấy một triển khai REST như tôi đã mô tả, bạn sẽ trố mắt và nói với tôi về những lo ngại về kỹ thuật phần mềm của bạn chứ? Nếu vậy, họ sẽ là gì?