Sự khác biệt giữa PUT, POST và PATCH là gì? [đóng cửa]


281

Sự khác biệt giữa các phương thức PUT, POST và PATCH trong giao thức HTTP là gì?




12
Sử dụng bất cứ thứ gì khác ngoài GET / POST là điên rồ trong các API web hiện đại. Quá nhiều làm điều đó. Các URI được xác định trong hầu hết các ứng dụng hiện đại KHÔNG phải là tài nguyên được thay thế, cập nhật, v.v. Chúng không phải là tài liệu. Chúng được gọi là THỦ TỤC. Bản thân URI hiếm khi xác định một tài nguyên thực tế, ngoài phương thức được gọi. Do đó, sử dụng GET cho các yêu cầu chuỗi truy vấn và POST khi bạn cần đăng dữ liệu hoặc tệp JSON trong phần thân của yêu cầu. IMO, bất cứ điều gì khác đang cố gắng đánh bóng các khái niệm lỗi thời liên quan đến URI và các hoạt động trên các tài liệu HTML tĩnh thành một kiến ​​trúc mới trông không giống như nó.
Triynko

1
Tất cả các câu trả lời tuyệt vời. Tôi chỉ muốn chia sẻ câu trả lời của tôi về sự khác biệt và khi nào bạn nên sử dụng từng cái.
Tàu

@Triynko Và các quy trình bạn đề cập đến liên quan đến việc tạo , xóasửa đổi tài nguyên. Không có cách nào tốt hơn để truyền đạt những ý tưởng như vậy hơn là RESTful. Tại sao không?
Toàn cảnh

Câu trả lời:


200

Sự khác biệt giữa PUT, POST, GET, DELETE và PATCH IN HTTP Verbs:

Các động từ HTTP được sử dụng phổ biến nhất POST, GET, PUT, DELETE tương tự như các thao tác CRUD (Tạo, Đọc, Cập nhật và Xóa) trong cơ sở dữ liệu. Chúng tôi xác định những động từ HTTP trong vốn hợp cụ thể. Vì vậy, dưới đây là so sánh giữa chúng.

  1. tạo - POST
  2. đọc - NHẬN
  3. cập nhật - PUT
  4. xóa - XÓA

VĂN BẢN: Gửi một sửa đổi một phần cho tài nguyên. Nếu bạn chỉ cần cập nhật một trường cho tài nguyên, bạn có thể muốn sử dụng phương thức PATCH.

Lưu ý:
Vì POST, PUT, DELETE sửa đổi nội dung, các bài kiểm tra với Fiddler cho url bên dưới chỉ bắt chước các cập nhật. Nó không xóa hoặc sửa đổi thực sự. Chúng ta chỉ có thể xem các mã trạng thái để kiểm tra xem có chèn thêm, cập nhật, xóa hay không.

URL: http://jsonplaceholder.typicode.com/posts/

1) NHẬN:

GET là loại phương thức yêu cầu HTTP đơn giản nhất; một trình duyệt sử dụng mỗi khi bạn nhấp vào liên kết hoặc nhập URL vào thanh địa chỉ. Nó ra lệnh cho máy chủ truyền dữ liệu được xác định bởi URL đến máy khách. Dữ liệu không bao giờ được sửa đổi ở phía máy chủ do yêu cầu GET. Theo nghĩa này, một yêu cầu GET là chỉ đọc.

Kiểm tra với Fiddler hoặc PostMan: Chúng tôi có thể sử dụng Fiddler để kiểm tra phản hồi. Mở Fiddler và chọn tab Soạn. Chỉ định động từ và url như hiển thị bên dưới và nhấp vào Thực thi để kiểm tra phản hồi.

Động từ: NHẬN

url: http://jsonplaceholder.typicode.com/posts/

Phản hồi: Bạn sẽ nhận được phản hồi như:

"userId": 1, "id": 1, "title": "sunt aut ...", "cơ thể": "quia et suscipit ..."

Trong đường dẫn của Happy Happy (hoặc không có lỗi), GET trả về một đại diện bằng XML hoặc JSON và mã phản hồi HTTP là 200 (OK). Trong trường hợp lỗi, nó thường trả về 404 (KHÔNG TÌM KIẾM) hoặc 400 (BẮT BUỘC YÊU CẦU).

2) BÀI:

Động từ POST chủ yếu được sử dụng để tạo tài nguyên mới. Cụ thể, nó được sử dụng để tạo tài nguyên cấp dưới. Đó là, phụ thuộc vào một số tài nguyên (ví dụ: cha mẹ) khác.

Khi tạo thành công, trả về trạng thái HTTP 201, trả về tiêu đề Vị trí có liên kết đến tài nguyên mới được tạo với trạng thái HTTP 201.

Kiểm tra với Fiddler hoặc PostMan: Chúng tôi có thể sử dụng Fiddler để kiểm tra phản hồi. Mở Fiddler và chọn tab Soạn. Chỉ định động từ và url như hiển thị bên dưới và nhấp vào Thực thi để kiểm tra phản hồi.

Động từ: POST

url: http://jsonplaceholder.typicode.com/posts/

Cơ quan yêu cầu:

dữ liệu: {title: 'foo', body: 'bar', userId: 1000, Id: 1000}

Phản hồi: Bạn sẽ nhận được mã phản hồi là 201.

Nếu chúng tôi muốn kiểm tra bản ghi được chèn với Id = 1000, hãy thay đổi động từ thành Nhận và sử dụng cùng một url và nhấp vào Thực thi.

Như đã nói trước đó, url trên chỉ cho phép đọc (GET), chúng tôi không thể đọc dữ liệu cập nhật trong thực tế.

3) PUT:

PUT thường được sử dụng cho các khả năng cập nhật , PUT-ing đến một URI tài nguyên đã biết với phần thân yêu cầu có chứa đại diện mới được cập nhật của tài nguyên ban đầu.

Kiểm tra với Fiddler hoặc PostMan: Chúng tôi có thể sử dụng Fiddler để kiểm tra phản hồi. Mở Fiddler và chọn tab Soạn. Chỉ định động từ và url như hiển thị bên dưới và nhấp vào Thực thi để kiểm tra phản hồi.

Động từ: PUT

url: http://jsonplaceholder.typicode.com/posts/1

Cơ quan yêu cầu:

dữ liệu: {title: 'foo', body: 'bar', userId: 1, Id: 1}

Trả lời: Khi cập nhật thành công, nó trả về 200 (hoặc 204 nếu không trả lại bất kỳ nội dung nào trong phần thân) từ PUT.

4) XÓA:

XÓA là khá dễ hiểu. Nó được sử dụng để xóa tài nguyên được xác định bởi URI.

Khi xóa thành công, trả về trạng thái HTTP 200 (OK) cùng với phần thân phản hồi, có thể là biểu diễn của mục đã xóa (thường yêu cầu quá nhiều băng thông) hoặc phản hồi được bao bọc (xem Giá trị trả về bên dưới). Hoặc là hoặc trả về trạng thái HTTP 204 (KHÔNG CÓ NỘI DUNG) mà không có phần phản hồi. Nói cách khác, trạng thái 204 không có phần thân hoặc phản hồi kiểu JSEND và trạng thái HTTP 200 là các phản hồi được đề xuất.

Kiểm tra với Fiddler hoặc PostMan: Chúng tôi có thể sử dụng Fiddler để kiểm tra phản hồi. Mở Fiddler và chọn tab Soạn. Chỉ định động từ và url như hiển thị bên dưới và nhấp vào Thực thi để kiểm tra phản hồi.

Động từ: XÓA

url: http://jsonplaceholder.typicode.com/posts/1

Trả lời: Khi xóa thành công, nó trả về trạng thái HTTP 200 (OK) cùng với phần thân phản hồi.

Ví dụ giữa PUT và PATCH

ĐẶT

Nếu tôi phải thay đổi tên của mình thì hãy gửi yêu cầu PUT để cập nhật:

{"First": "Nazmul", "last": "hasan"} Vì vậy, ở đây để cập nhật tên đầu tiên, chúng tôi cần gửi lại tất cả các tham số của dữ liệu.

VÁ:

Yêu cầu vá nói rằng chúng tôi sẽ chỉ gửi dữ liệu mà chúng tôi cần sửa đổi mà không sửa đổi hoặc ảnh hưởng đến các phần khác của dữ liệu. Ví dụ: nếu chúng tôi chỉ cần cập nhật tên đầu tiên, chúng tôi chỉ chuyển tên đầu tiên.

Vui lòng tham khảo các liên kết dưới đây để biết thêm thông tin:

https://jsonplaceholder.typicode.com/

https://github.com/typicode/jsonplaceholder#how-to

Sự khác biệt chính giữa yêu cầu PATCH và PUT là gì?

http://www.restapitutorial.com/lessons/httpmethods.html


62
PUT không được cập nhật. PUT được tạo hoặc thay thế thực thể tại URI đã cho. Theo thông số HTTP, PUT là idempotent. Vâng, nó có thể được sử dụng để cập nhật, nhưng chỉ nghĩ là cập nhật là không chính xác.
Maladon

2
Tôi đồng ý PUT không cập nhật, nó có thể được ánh xạ với thay thế, bởi vì khi bạn gửi PUT, nó sẽ ghi đè lên tài nguyên hiện có. Nhưng nếu chúng tôi gửi PATCH, nó sẽ chỉ thay thế các mục được chỉ định.
Atul Chavan

1
Vì PUT cũng có thể được sử dụng để tạo, tôi không chắc câu trả lời của bạn cho biết tôi nên sử dụng cái nào?
Rob P.

1
Câu trả lời này tốt hơn nhiều, nhưng không so sánh với PATCH: stackoverflow.com/a/630475/2391795
Vadorequest

47

PUT = thay thế TÀI NGUYÊN ENTIRE bằng đại diện mới được cung cấp

PATCH = thay thế các phần của tài nguyên nguồn bằng các giá trị được cung cấp AND | HOẶC các phần khác của tài nguyên được cập nhật mà bạn chưa cung cấp (dấu thời gian) VÀ | HOẶC cập nhật các tài nguyên ảnh hưởng đến các tài nguyên khác (mối quan hệ)

https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-b between -put-and-patch? page = 1


11

Định nghĩa dưới đây là từ ví dụ thế giới thực.

Ví dụ Tổng quan
Đối với mỗi dữ liệu khách hàng, chúng tôi đang lưu trữ một mã định danh để tìm dữ liệu khách hàng đó và chúng tôi sẽ gửi lại định danh đó cho khách hàng đó để tham khảo.

  1. BÀI ĐĂNG

    • Nếu Khách hàng gửi dữ liệu mà không có bất kỳ định danh nào bằng phương thức POST thì chúng tôi sẽ lưu trữ dữ liệu đó và gán một mã định danh mới.
    • Nếu Khách hàng lại gửi cùng một dữ liệu mà không có bất kỳ định danh nào bằng phương thức POST, thì chúng tôi sẽ lưu trữ dữ liệu đó và gán một mã định danh mới.
    • Lưu ý : Sao chép được cho phép ở đây
  2. ĐẶT

    • Nếu Khách hàng gửi dữ liệu bằng mã định danh thì chúng tôi sẽ kiểm tra xem mã định danh đó có tồn tại không. Nếu định danh tồn tại, chúng tôi sẽ cập nhật dữ liệu khác, chúng tôi sẽ tạo nó và gán một định danh mới.
    • Nếu Khách hàng gửi dữ liệu bằng mã định danh thì chúng tôi sẽ kiểm tra xem mã định danh đó có tồn tại không. Nếu định danh tồn tại, chúng tôi sẽ cập nhật dữ liệu khác, chúng tôi sẽ đưa ra một ngoại lệ.

Lưu ý: Bật Phương thức Đặt , Chúng tôi sẽ không ném ngoại lệ nếu không tìm thấy số nhận dạng. Nhưng trong phương pháp Patch , chúng tôi sẽ đưa ra một ngoại lệ nếu không tìm thấy định danh.

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào ở trên.


8

Các loại yêu cầu

  • tạo - POST
  • đọc - NHẬN
  • tạo hoặc cập nhật - PUT
  • xóa - XÓA
  • cập nhật - VÒI

NHẬN / PUT là VÒI bình thường đôi khi có thể là idempotent

Idempotent là gì - Có nghĩa là nếu chúng tôi thực hiện truy vấn nhiều lần thì nó sẽ không ảnh hưởng đến kết quả của nó.

get : -

nhận đơn giản. Lấy dữ liệu từ máy chủ và hiển thị cho người dùng

{
id:1
name:parth
email:x@x.com
}

post : -

tạo tài nguyên mới tại cơ sở dữ liệu. Nó có nghĩa là nó thêm dữ liệu mới. Nó không bình thường.

put : -

Tạo tài nguyên mới nếu không thêm vào hiện có. Idempotent bởi vì nó sẽ cập nhật cùng một tài nguyên mọi lúc và đầu ra sẽ giống nhau. Ví dụ. - dữ liệu ban đầu

{
id:1
name:parth
email:x@x.com
}
  • thực hiện put-localhost / 1 đặt email: ppp@ppp.com
{
id:1
email:ppp@ppp.com
}

patch

Vì vậy, bây giờ đến bản vá yêu cầu PATCH đôi khi có thể là idempotent

id:1
name:parth
email:x@x.com
}

tên bản vá: w

{
id:1
name:w
email:x@x.com
}
Phương thức HTTP
NHẬN
POST không
ĐÚNG
VÒI không *
LỰA CHỌN
Đầu có
XÓA có

Tài nguyên: Idempotent - Idempotency là gì?


Idempotent "đôi khi" thực sự có nghĩa là gì? Điều gì quyết định sự bình tĩnh?
Polv

7

đây là một mô tả đơn giản của tất cả:

  • POST luôn để tạo tài nguyên (không quan trọng nếu nó được sao chép)
  • PUT là để kiểm tra nếu tài nguyên tồn tại rồi cập nhật, khác tạo tài nguyên mới
  • PATCH luôn để cập nhật tài nguyên

5

Sự khác biệt chính giữa các yêu cầu PUTPATCH :

Giả sử chúng ta có một tài nguyên chứa tên và họ của một người.

Nếu chúng tôi muốn thay đổi tên thì chúng tôi sẽ gửi yêu cầu đặt để cập nhật

{ "first": "Michael", "last": "Angelo" }

Ở đây, mặc dù chúng tôi chỉ thay đổi tên đầu tiên, với yêu cầu PUT, chúng tôi phải gửi cả hai tham số đầu tiên và cuối cùng.
Nói cách khác, bắt buộc phải gửi lại tất cả các giá trị, toàn bộ tải trọng.

Tuy nhiên, khi chúng tôi gửi yêu cầu PATCH, chúng tôi chỉ gửi dữ liệu mà chúng tôi muốn cập nhật. Nói cách khác, chúng tôi chỉ gửi tên đầu tiên để cập nhật, không cần gửi tên cuối cùng.


2

Khá hợp lý sự khác biệt giữa PUT & PATCH wrt gửi dữ liệu đầy đủ và một phần để thay thế / cập nhật tương ứng. Tuy nhiên, chỉ cần một vài điểm như dưới đây

  1. Đôi khi POST được coi là để cập nhật wrt PUT để tạo
  2. HTTP có bắt buộc / kiểm tra để gửi toàn bộ so với dữ liệu một phần trong PATCH không? Mặt khác, PATCH có thể khá giống như cập nhật như trong PUT / POST

2

Nghĩ theo cách này...

POST - tạo

PUT - thay thế

VÒI - cập nhật

NHẬN - đọc

XÓA - xóa


2
Tôi có thể thêm vào sự khác biệt này : " PUT nếu máy khách xác định địa chỉ của tài nguyên kết quả, POST nếu máy chủ thực hiện. "
ruffin

1

Giải thích đơn giản nhất:

POST - Tạo bản ghi MỚI

PUT - Nếu bản ghi tồn tại, cập nhật khác, tạo bản ghi mới

VÒI - cập nhật

NHẬN - đọc

XÓA - xóa


Điều này thực sự khác biệt như thế nào với câu trả lời của Kwame được đăng khoảng hai tuần trước bạn?
ruffin
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.