Thực hành 'tốt nhất' cho phản hồi POST yên tĩnh


217

Vì vậy, không có gì mới ở đây tôi chỉ đang cố gắng để làm rõ và dường như không thể tìm thấy bất kỳ trong các bài viết khác.

Tôi đang tạo ra một nguồn tài nguyên mới một cách đầy đủ, nói:

/books (POST)

với một cơ thể:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Tôi biết rằng tôi nên trả lại một 201 (Đã tạo) với tiêu đề Vị trí của tài nguyên mới:

Location: /books/12345

Câu hỏi tôi dường như không thể tự trả lời là máy chủ nên trả về cái gì trong cơ thể.

Tôi thường thực hiện loại phản ứng này:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Tôi đã làm điều này vì một vài lý do:

  1. Tôi đã viết api cho các khung giao diện người dùng như angularjs. Trong trường hợp cụ thể của tôi, tôi đang sử dụng tài nguyên góc và tôi thường chỉ cần id cho tài nguyên để xác định vị trí của nó. Nếu tôi không trả lại id trong phần phản hồi, tôi sẽ cần phân tích nó ra khỏi tiêu đề Vị trí.
  2. Trong một GET của tất cả các cuốn sách, tôi thường trả lại toàn bộ đối tượng không chỉ là id. Theo nghĩa này, mã máy khách của tôi không phải phân biệt nơi lấy id từ (tiêu đề vị trí hoặc phần thân).

Bây giờ tôi biết tôi thực sự ở trong khu vực màu xám ở đây, nhưng hầu hết mọi người đang nói rằng trả lại toàn bộ tài nguyên là thực tế 'xấu'. Nhưng nếu máy chủ thay đổi / thêm thông tin vào tài nguyên. Nó chắc chắn thêm id, nhưng cũng có thể thêm những thứ khác như dấu thời gian. Trong trường hợp tôi không trả lại toàn bộ tài nguyên, có thực sự tốt hơn khi thực hiện POST, trả lại id, sau đó để máy khách thực hiện GET để lấy tài nguyên mới.


Cá nhân tôi thích cơ thể trống rỗng cho các phản hồi POST. Giá trị tiêu đề Vị trí RESTful không phải là một URI (mã định danh tài nguyên duy nhất)? Vì vậy, có lẽ bạn nên sử dụng nó làm ID và không phân tích nó để tìm ra ID nội bộ của máy chủ. Người dùng IMO, API RESTful nên điều hướng bằng cách sử dụng các siêu liên kết được cung cấp và không xây dựng đường dẫn, đoán xem một máy chủ cụ thể định vị tài nguyên ở đâu ... Và sau tất cả, khách hàng có biết trạng thái của tài nguyên mà nó vừa tạo không? lặp đi lặp lại nó gây lãng phí tài nguyên mạng.
ch4mp

1
Để tạo / Chèn, Trạng thái 201 - TẠO, Vị trí tiêu đề → localhost: 8080 / nhân viên / 1 (Xem: tại đây )
Hassan Tareq

Câu trả lời:


129

Trả lại toàn bộ đối tượng trên một bản cập nhật có vẻ không liên quan lắm, nhưng tôi khó có thể hiểu tại sao việc trả lại toàn bộ đối tượng khi nó được tạo sẽ là một thực tiễn xấu trong trường hợp sử dụng thông thường. Điều này sẽ hữu ích ít nhất là để có được ID dễ dàng và để có được dấu thời gian khi có liên quan. Đây thực sự là hành vi mặc định có được khi giàn giáo với Rails.

Tôi thực sự không thấy bất kỳ lợi thế nào khi chỉ trả lại ID và thực hiện yêu cầu GET sau đó, để có được dữ liệu bạn có thể nhận được với POST ban đầu của mình.

Dù sao, miễn là API của bạn nhất quán, tôi nghĩ rằng bạn nên chọn mẫu phù hợp với nhu cầu của mình nhất. Không có bất kỳ cách chính xác nào về cách xây dựng API REST, imo.


26
Tôi biết điều này đã cũ, nhưng tôi có thể đưa ra một lập luận thuyết phục cho việc sử dụng GET sau POST của bạn. Trong http / 1.1, bất kỳ công cụ lịch sử nào cũng có thể bỏ qua các cài đặt bộ đệm được truyền lại từ phản hồi GET của bạn ... vì vậy nếu người dùng của bạn sử dụng nút quay lại trong trình duyệt để quay lại trang này sau khi bạn cập nhật nó bằng POST thì nó có thể sử dụng cũ dữ liệu được lưu trong bộ nhớ cache từ GET gốc. Vì vậy, nếu bạn sử dụng lại GET thì bạn có thể cập nhật bộ đệm và có được ảnh chụp nhanh hơn về cách trang nhìn khi họ rời đi ...
Shaded

8
@Shaded Nếu API cũng được thiết kế để sử dụng cho các ứng dụng, thì đối số của bạn để thực hiện hai yêu cầu sẽ không được giữ. Ở đó, bạn thường lưu trữ dữ liệu bằng cách giữ các đối tượng của kiểu mô hình trong bộ nhớ - thường được thực hiện với phản hồi cho các yêu cầu POST. Và đối với các trình duyệt, phản hồi về yêu cầu POST không thực sự gây tổn hại miễn là vẫn còn điểm cuối GET api.
Jeehut

Tôi đăng ký những gì Daniel nói ở đây. Ngay cả khi bạn kiểm tra các khung trưởng thành như Spring Data, chúng luôn trả về toàn bộ đối tượng sau khi duy trì nó. Tôi nghĩ rằng đó là một thực tiễn tốt, vì trong máy khách của bạn, bạn sẽ lưu một máy chủ khứ hồi để có được thông tin tương tự
frandevel

205

Trả lại đối tượng mới phù hợp với nguyên tắc REST của "Giao diện thống nhất - Thao tác tài nguyên thông qua các biểu diễn." Đối tượng hoàn chỉnh là đại diện cho trạng thái mới của đối tượng đã được tạo.

Có một tài liệu tham khảo thực sự tuyệt vời cho thiết kế API, ở đây: Thực tiễn tốt nhất để thiết kế API RESTful thực dụng

Nó bao gồm một câu trả lời cho câu hỏi của bạn ở đây: Cập nhật & tạo sẽ trả lại một đại diện tài nguyên

Nó nói rằng:

Để ngăn người tiêu dùng API không phải đánh lại API cho đại diện được cập nhật, hãy yêu cầu API trả lại đại diện đã cập nhật (hoặc được tạo) như một phần của phản hồi.

Có vẻ thực dụng với tôi và nó phù hợp với nguyên tắc REST mà tôi đã đề cập ở trên.


6
Làm thế nào về việc trả lại toàn bộ các đối tượng có liên quan? bằng cách này, việc sắp xếp có thể được thực hiện ở phía máy chủ và nó giúp giảm bớt việc thực hiện front-end
phil294

2
Nhưng những thực hành tốt nhất này không phải là tốt nhất. Không được sử dụng statet tác giả rằng HATEOAS, cũng quan trọng như các nguyên tắc khác, vì "nó chưa sẵn sàng". HATEOAS sẽ không bao giờ "sẵn sàng", bởi vì tất cả các nguyên tắc RESTful chỉ là các nguyên tắc thiết kế kiến ​​trúc, không thực hiện cụ thể. Tham chiếu được trích dẫn là về tầm nhìn của tác giả về API RESTful, hoàn toàn không phải là RESTful vì đã bỏ HATEOAS. Đó là lý do tại sao đây không phải là tài liệu tham khảo tốt nhất :)
marcinn

1
@marcinn - bạn sẽ lưu ý rằng câu hỏi ban đầu có trích dẫn xung quanh 'Tốt nhất', tôi đoán vì có rất nhiều ý kiến ​​trong lĩnh vực này. Tài liệu tham khảo tôi đã chỉ ra là một cái gì đó tôi thấy là thực tế. Nếu bạn có một tài liệu tham khảo tốt hơn xin vui lòng chia sẻ nó. Tôi luôn luôn mở để học hỏi thêm.
grahamesd

@grahamesd Một triển khai là một điều khác biệt mà pricipl / mẫu thiết kế kiến ​​trúc. Không ai có thể mong đợi rằng HATEOAS sẽ sẵn sàng vào một ngày nào đó, nhưng có khả năng ai đó sẽ tạo ra một triển khai được nhiều người chấp nhận. Vinay cũng đã viết về việc ánh xạ các phương thức http sang URL và các hoạt động cụ thể (CRUD), nói rằng việc tạo phiên bản bằng các url tiền tố là thực dụng hơn, đã viết rằng lọc theo các tham số truy vấn là một cách để ... không sao cả làm với kiến ​​trúc RESTful. Ông đã viết về một số loại hợp đồng. Điều đó tốt cho API HTTP, nhưng đừng gọi nó là RESTful.
marcinn

@grahamesd Dưới đây là một số bài viết giải thích điều này: - Medium.com/@andrea.chiarelli/ Kẻ - restfulapi.net
marcinn
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.