Phương thức HTTP nào khớp với phương thức CRUD nào?


213

Trong lập trình kiểu RESTful, chúng ta nên sử dụng các phương thức HTTP làm các khối xây dựng. Tôi hơi bối rối mặc dù phương thức nào phù hợp với phương pháp CRUD cổ điển. NHẬN / Đọc và XÓA / Xóa là đủ rõ ràng.

Tuy nhiên, sự khác biệt giữa PUT / POST là gì? Họ có khớp một với một với Tạo và Cập nhật không?

Câu trả lời:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT có thể ánh xạ tới cả Tạo và Cập nhật tùy thuộc vào sự tồn tại của URI được sử dụng với PUT.

POST bản đồ để tạo.

Sửa chữa: POST cũng có thể ánh xạ tới Cập nhật mặc dù nó thường được sử dụng cho Tạo. POST cũng có thể là một bản cập nhật một phần vì vậy chúng tôi không cần phương pháp PATCH đề xuất.


16
+1: Sự khác biệt bạn tạo ra giữa PUT để tạo tài nguyên có tên (URI) được gán bởi máy khách và POST để tạo tài nguyên có tên được máy chủ gán cho là quan trọng. Xem Dịch vụ web đầy đủ của Richardson và Ruby (O'Reilly) để thảo luận về nó.
Jim Ferrans

9
Và vì PUT và DELETE chưa được hỗ trợ bởi các trình duyệt web, nên "quá tải POST" được coi là ổn bằng cách thêm một đối số chuỗi truy vấn như method = PUT hoặc method = DELETE trên URI được POST.
Jim Ferrans


13
@JimFerrans PUT và DELETE được các trình duyệt web hỗ trợ tốt, với XHR. Tuy nhiên, trong ngữ cảnh của các biểu mẫu HTML, đặc tả HTML không hỗ trợ chúng để trình duyệt không thể.
eis

3
Mặc dù không ánh xạ chính tắc tới một chữ cái trong CRUD, rất nhiều khung REST cũng sử dụng các thực thể GET / entity / to List của thực thể kiểu . GET / entity / id sẽ đọc thực thể cụ thể khớp với id .
Toddius Zho

49

Toàn bộ quan trọng là cho dù bạn đang làm một idempotent thay đổi hay không. Đó là, nếu thực hiện hành động trên tin nhắn hai lần sẽ dẫn đến kết quả là cùng một điều mà ở đó như thể nó chỉ được thực hiện một lần, bạn đã có một thay đổi tạm thời và nó sẽ được ánh xạ tới PUT. Nếu không, nó ánh xạ tới POST. Nếu bạn không bao giờ cho phép khách hàng tổng hợp URL, PUT khá gần với Cập nhật và POST có thể xử lý Tạo tốt, nhưng đó chắc chắn không phải là cách duy nhất để làm điều đó; nếu khách hàng biết rằng nó muốn tạo /foo/abcvà biết nội dung nào sẽ được đặt ở đó, thì nó hoạt động tốt như một PUT.

Mô tả chính tắc của POST là khi bạn cam kết mua một thứ gì đó: đó là một hành động mà không ai muốn lặp lại mà không biết. Ngược lại, việc đặt địa chỉ công văn cho đơn đặt hàng trước có thể được thực hiện với PUT hoàn toàn tốt: không vấn đề gì nếu bạn được yêu cầu gửi đến 6 Anywhere Dr, Nowherevillemột lần, hai lần hoặc một trăm lần: đó vẫn là cùng một địa chỉ. Điều đó có nghĩa là đó là một bản cập nhật? Có thể là tất cả phụ thuộc vào cách bạn muốn viết back-end. (Lưu ý rằng kết quả có thể không giống nhau: bạn có thể báo cáo lại cho người dùng khi họ thực hiện PUT như một phần của việc thể hiện tài nguyên, điều này sẽ đảm bảo rằng PUT lặp lại không gây ra kết quả giống hệt nhau, nhưng kết quả vẫn sẽ là những người giống nhau trong một ý nghĩa chức năng.)


1
Sự khác biệt này giữa các trường hợp sử dụng cho POSTPUTlà một trường hợp thú vị và nên đưa ra câu trả lời cho "Cái nào là 'tạo' và cái nào là 'cập nhật'?" điều đó rõ ràng hơn nhiều Hơn nữa, liên quan đến việc triển khai API, nó sẽ tuân theo việc lặp đi lặp lại PUTnên có giá trị im lặng, trong khi đó, việc lặp đi lặp lại POSTcó thể đưa ra một ngoại lệ nếu một số khía cạnh của dữ liệu được gửi vẫn là duy nhất trong kho lưu trữ dữ liệu sao lưu ứng dụng.
zerobandwidth

2
Câu trả lời và nhận xét sau đây nêu lên một điểm quan trọng, cần thận trọng khi đánh giá CRUD gần với (1to1) với ngữ nghĩa HTTP REST. Đây không phải là một bản đồ chính tắc.
Martin Spamer

35

Tôi đã tìm kiếm cùng một câu trả lời, đây là những gì IBM nói. Liên kết IBM

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

Ngay bây giờ (2016) các động từ HTTP mới nhất là GET, POST, PATCH , PUT và DELETE

Tổng quat

  • NHẬN HTTP - CHỌN / Yêu cầu
  • PUT HTTP - CẬP NHẬT
  • POST HTTP - CHERTN / Tạo
  • HTTP PATCH - Khi PUT ting một biểu diễn tài nguyên hoàn chỉnh là cồng kềnh và sử dụng nhiều băng thông hơn, ví dụ: khi bạn phải cập nhật một phần một cột
  • XÓA HTTP - XÓA

Hi vọng điêu nay co ich!

Nếu bạn quan tâm đến việc thiết kế API REST thì đây là một cách đọc vô nghĩa! trang web phiên bản trực tuyến kho lưu trữ github


1
Kể từ ngày 18 tháng 2, hãy lưu ý rằng PATCH không được triển khai triệt để trong các thư viện máy khách và máy chủ.
Dizzley

oh ok cảm ơn tôi thấy ... bạn có phiền đăng một liên kết / tài liệu tham khảo để tôi có thể xem được không?
d1jhoni1b

9

Có một cuộc trò chuyện video youtube tuyệt vời bởi Stormpath thực sự giải thích điều này, URL nên bỏ qua phần chính xác của video:

video youtube

Ngoài ra, đáng để xem hơn một giờ nói chuyện nhưng rất thú vị nếu bạn nghĩ đến việc đầu tư thời gian vào việc xây dựng một api REST.


7

Nó phụ thuộc vào tình hình cụ thể .. nhưng nói chung:

PUT = cập nhật hoặc thay đổi tài nguyên cụ thể bằng URI cụ thể của tài nguyên.

POST = tạo tài nguyên mới theo nguồn của URI đã cho.

I E

Chỉnh sửa một bài đăng trên blog:

PUT: / blog / mục / 1

Tạo một cái mới:

POST: / blog / mục

PUT có thể tạo một tài nguyên mới trong một số trường hợp trong đó URI của nguồn tài nguyên mới rõ ràng trước yêu cầu. POST cũng có thể được sử dụng để thực hiện một số trường hợp sử dụng khác, những trường hợp không được bao phủ bởi những trường hợp khác (GET, PUT, DELETE, Head, OPTION)

Hiểu biết chung cho các hệ thống CRUD là GET = request, POST = tạo, Put = update, DELETE = xóa


4

Các khối xây dựng của REST chủ yếu là các tài nguyên (và URI) và hypermedia. Trong bối cảnh này, GETlà cách để có được một đại diện của tài nguyên (mà thực sự có thể được ánh xạ tới một SELECTthuật ngữ CRUD).

Tuy nhiên, bạn không nhất thiết phải mong đợi ánh xạ một-một giữa các hoạt động CRUD và động từ HTTP. Sự khác biệt chính giữa PUTPOSTlà về tài sản bình thường của họ. POSTcũng được sử dụng phổ biến hơn cho các cập nhật một phần, vì PUTnói chung ngụ ý gửi một đại diện hoàn toàn mới của tài nguyên.

Tôi khuyên bạn nên đọc nó:

Đặc tả HTTP cũng là một tài liệu tham khảo hữu ích:

Phương thức PUT yêu cầu thực thể kèm theo được lưu trữ theo URI yêu cầu được cung cấp.

[...]

Sự khác biệt cơ bản giữa các yêu cầu POST và PUT được phản ánh theo nghĩa khác nhau của URI yêu cầu. URI trong yêu cầu POST xác định tài nguyên sẽ xử lý thực thể kèm theo. Tài nguyên đó có thể là một quá trình chấp nhận dữ liệu, một cổng vào một số giao thức khác hoặc một thực thể riêng biệt chấp nhận các chú thích. Ngược lại, URI trong yêu cầu PUT xác định thực thể kèm theo yêu cầu - tác nhân người dùng biết URI dự định là gì và máy chủ KHÔNG cố gắng áp dụng yêu cầu cho một số tài nguyên khác. Nếu máy chủ mong muốn rằng yêu cầu được áp dụng cho một URI khác,


3

Nói chung, đây là mẫu tôi sử dụng:

  • NHẬN HTTP - CHỌN / Yêu cầu
  • PUT HTTP - CẬP NHẬT
  • POST HTTP - CHERTN / Tạo
  • XÓA HTTP - XÓA

5
PUT và POST không khớp chính xác với Cập nhật hoặc Tạo; PUT là bộ cài đặt (nghĩa là bạn biết tên tài nguyên trước đó và đang đưa ra giá trị để sử dụng) và POST là mọi thứ khác. Điều quan trọng là phải suy nghĩ về những việc bạn đang làm là idempotent hay không.
Donal Fellows

1
+1 trên bình luận. Giả định về một ánh xạ tuyệt đối giữa hai có thể gây hiểu nhầm. Một hoạt động XÓA HTTP sang một số URI, ví dụ, có thể chỉ cần sửa đổi (ví dụ CẬP NHẬT) một bản ghi phía máy chủ để hoạt động HTTP GET không còn trả về một đại diện.
đứng

4
PUT và POST không khớp chính xác với Cập nhật hoặc Tạo . Đúng nhưng AJ đã mô tả mô hình anh ta sử dụng.
Piotr Dobrogost

1

Các Symfony dự án cố gắng để giữ cho phương thức HTTP của mình tham gia với phương pháp CRUD, và danh sách của họ đối tác như sau:

  • NHẬN Lấy tài nguyên từ máy chủ
  • POST Tạo tài nguyên trên máy chủ
  • PUT Cập nhật tài nguyên trên máy chủ
  • XÓA Xóa tài nguyên khỏi máy chủ

Điều đáng chú ý là, như họ nói trên trang đó, "Trong thực tế, nhiều trình duyệt hiện đại không hỗ trợ các phương thức PUT và DELETE."

Từ những gì tôi nhớ, Symfony "giả mạo" PUT và DELETE cho những trình duyệt không hỗ trợ chúng khi tạo biểu mẫu của nó, để cố gắng sử dụng phương thức HTTP đúng về mặt lý thuyết ngay cả khi trình duyệt không hỗ trợ nó

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.