2010-05-31 7 views
12

Tôi biết bạn không muốn đăng biểu mẫu bằng tên người dùng và mật khẩu mà bất kỳ ai cũng có thể sử dụng lịch sử để xem hoặc tình huống không thể thực hiện hành động lặp lại (làm mới trang = thêm mục vào giỏ hàng có thể không mong muốn). Vì vậy, tôi có một sự hiểu biết khi tôi có thể muốn sử dụng một trong khác. Nhưng tôi luôn có thể máy chủ chuyển hướng URL sau khi GET để giải quyết vấn đề giỏ hàng và có thể hầu hết các biểu mẫu của tôi sẽ hoạt động hoàn toàn tốt với GET.Tại sao tôi nên POST dữ liệu thay vì GET?

Tại sao tôi nên sử dụng POST over GET? Tôi không hiểu lợi ích của cái này qua cái kia. Tôi nhận thấy POST không thêm dữ liệu vào lịch sử/URL và sẽ cảnh báo bạn về việc làm mới trang, nhưng đó là hai sự khác biệt duy nhất tôi biết. Tại sao một nhà phát triển có thể tôi muốn sử dụng cái này qua cái kia?

+1

Thêm các mục vào giỏ hàng với GET là một ý tưởng tồi vì yêu cầu GET không bao giờ được cho là có tác dụng phụ trên máy chủ. Có các chương trình tìm nạp trước như FasterFox và Trình tăng tốc Web của Google tải trước nội dung từ các liên kết trên một trang bằng cách tải xuống các trang trước. Nếu bạn không may mắn, họ có thể sẽ thêm các mục vào giỏ hàng khi người dùng của bạn chỉ đọc một trang sản phẩm. – Martin

+1

@Martin. Có lý. Điều gì về ajax khôn ngoan? Có một sự khác biệt nếu tôi sử dụng GET hoặc POST? Không có gì có thể dự đoán dữ liệu tôi đang gửi nếu tôi phải chạy qua một vài hàm javascript làm cho yêu cầu. –

+1

Trình tìm nạp trước không phải là vấn đề đối với các yêu cầu AJAX, nhưng tôi vẫn tin rằng đó là một ý tưởng hay để gắn vào ngữ nghĩa chính xác: GET reqs không được có tác dụng phụ trên máy chủ (tức là không tạo, xóa hoặc sửa đổi bất kỳ thứ gì). Nếu bạn chỉ đang tìm nạp dữ liệu (ví dụ: đối với hộp hoàn tất tự động) và dữ liệu được gửi đủ nhỏ để vừa với URL, thì GET sẽ hoạt động tốt. Không giống như các phản hồi POST, các phản hồi GET thậm chí có thể được lưu vào bộ nhớ cache, giúp cải thiện hiệu suất nhận thức của ứng dụng. – Martin

Trả lời

8

Mọi phương thức HTTP: POST, GET, PUT, DELETE, v.v. đều khắc sâu ngữ nghĩa riêng của nó. Khi chọn đúng phương pháp, điều quan trọng là phải hiểu HTTP và REST, vì đó là cách HTTP hoạt động và cách cơ sở hạ tầng mạng hoạt động.

Hướng dẫn tốt về REST có sẵn here. Dưới đây là những gì là nói về POST và GET phương pháp:

  • Bởi vì cùng một giao diện được sử dụng cho tất cả các tài nguyên, bạn có thể dựa vào khả năng lấy một đại diện - ví dụ, một số render của nó - sử dụng GET. Bởi vì ngữ nghĩa của GET được định nghĩa trong đặc điểm kỹ thuật, bạn có thể chắc chắn rằng bạn không có nghĩa vụ khi bạn gọi nó - đây là lý do tại sao phương pháp này được gọi là "an toàn". GET hỗ trợ bộ nhớ đệm rất hiệu quả và tinh vi, vì vậy trong nhiều trường hợp, bạn thậm chí không phải gửi yêu cầu tới máy chủ. Bạn cũng có thể chắc chắn rằng GET là không cần thiết - nếu bạn đưa ra yêu cầu GET và không nhận được kết quả, bạn có thể không biết liệu yêu cầu của bạn chưa bao giờ đến đích hay phản hồi bị mất khi bạn quay lại.

    Đảm bảo quyền sở hữu trí tuệ có nghĩa là bạn chỉ có thể gửi lại yêu cầu. Idempotence cũng được đảm bảo cho PUT (về cơ bản có nghĩa là "cập nhật tài nguyên này với dữ liệu này hoặc tạo nó tại URI này nếu nó chưa có)" và DELETE (bạn có thể thử lại lần nữa cho đến khi bạn nhận được kết quả - xóa cái gì đó không có đó không phải là vấn đề).BÀI ĐĂNG, thường có nghĩa là "tạo tài nguyên mới", cũng có thể được sử dụng để gọi xử lý tùy ý và do đó không an toàn cũng như không phải là mã số.

+0

Tôi đã xem trang còn lại trước đó. Nó không hữu ích. tôi vẫn không thấy lý do tại sao tôi nên sử dụng hơn khác, ngoại trừ 2 sự khác biệt tôi đã đề cập. Tôi không hiểu tại sao nhiều yêu cầu đọc/ghi của tôi không nên được (dễ dàng hơn cho tôi ...) –

+0

IMHO, hiểu REST là chìa khóa để trả lời câu hỏi của bạn. Tôi đã thêm liên kết đến một bài viết REST giới thiệu khác và trích dẫn phần mà chúng giải thích các phương thức an toàn và không có tính chất. Điều quan trọng là phải hiểu cơ sở hạ tầng web cơ bản (proxy, cổng, vv) sẽ hoạt động theo REST (hoặc thông số HTTP). – Dan

6

Tất cả dữ liệu trong yêu cầu GET được thực hiện trong URL, có giới hạn về kích thước và cũng hiển thị với người dùng. Yêu cầu POST cũng cho phép bạn gửi tải trọng.

Ngoài những khác biệt về mặt kỹ thuật, có vấn đề về mục đích. Tiêu chuẩn HTTP mô tả các cách mà các yêu cầu khác nhau (GET, POST, PUT, DELETE, HEAD) được dự định sẽ được sử dụng; ví dụ: PUT nhằm mục đích thêm tài nguyên, DELETE nhằm xóa một tài khoản và POST nhằm sửa đổi một tài nguyên. Bạn có thể sử dụng yêu cầu GET thay vì số PUT hoặc DELETE không? Chắc chắn, nhưng các tiêu chuẩn sau đây có ý định rõ ràng.

Xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html để biết thêm thông tin.

+0

Mục đích tạo sự khác biệt như thế nào? Tôi không thể nhớ nơi tôi nhìn thấy nó nhưng tôi đã nhận thấy dữ liệu POST không cập nhật bộ nhớ cache trang vì vậy nó có vẻ như một nhận được sẽ làm điều tương tự –

+0

Bạn đang đề cập đến triển khai cụ thể của khách hàng và máy chủ. Thực sự, họ được tự do làm bất cứ điều gì họ muốn. Không có gì ngăn cản bạn, bằng cách viết một máy chủ web loại bỏ tài nguyên trên mỗi 'GET', thêm tài nguyên vào mỗi' DELETE', v.v. Nhưng bạn sẽ tức giận nếu bạn là khách hàng và 'GET' đang xóa tài nguyên, bởi vì đây không phải là những gì chúng tôi mong đợi sẽ xảy ra. Đó là lý do tại sao ý định tạo nên sự khác biệt. – danben

+0

Đặt một cách khác, trong OOP bạn có thể hỏi tại sao bạn nên sử dụng 'getProperty()' chỉ để lấy thuộc tính và 'setProperty()' chỉ để thiết lập nó, khi bạn có thể làm ngược lại dễ dàng. Có một tiêu chuẩn giúp chúng ta không bị ngạc nhiên. – danben

1

Trong số những thứ khác, nhận được là giới hạn 2K (một số trình duyệt sẽ chấp nhận nhiều hơn) và nó được hiển thị trong URL

6

Nếu bạn muốn một idempotent yêu cầu URI (tức là phản ứng là luôn giống nhau), sau đó sử dụng GET, else POST.

+0

nếu tôi nhận được /blah.aspx và đăng lên/cmd/blah thay đổi? Ngoài ra tôi thấy một nơi nào đó GET được cache ngay cả sau khi một bài viết (có thể nó là một lỗi trình duyệt? Nhưng nó dường như không quan trọng nếu dữ liệu được GET hoặc POST-ed) –

+0

Phản hồi không nhất thiết phải giống nhau, chỉ có không tác dụng phụ quan sát được từ các yêu cầu lặp đi lặp lại. Trang này không phải lúc nào cũng giống nhau, nhưng tôi NHẬN nó nhiều lần sẽ không gây ra một hiệu ứng phụ quan sát được (với tôi ít nhất, Jeff và Co. May nhận thấy một loạt các lần truy cập nhật ký, v.v. Nhưng những thứ đó có liên quan đến người dùng) –

+0

Mark Brackett: Vì vậy, có vẻ như câu nói của bạn GET được phép tìm nạp trước khi bài đăng không được. Nhưng tìm nạp trước một biểu mẫu không có ý nghĩa và ngay bây giờ tôi đang làm nó với ajax mà cũng không có ý nghĩa vì nó không thể dự đoán đầu vào javascript nó sẽ cần. –

0

GET và POST có ý nghĩa ngữ nghĩa - GET được sử dụng để truy xuất tài nguyên và POST được sử dụng để sửa đổi nó. Các ngữ nghĩa là lý do tại sao bạn nhận thấy sự khác biệt trong trình duyệt web của bạn - vì POST bị cáo buộc sửa đổi dữ liệu, trình duyệt nên cảnh báo trước khi gửi lại yêu cầu/lệnh POST.

Toàn bộ web đi trên các ngữ nghĩa đó. Nó an toàn để lưu trữ một yêu cầu GET, nhưng không phải là một lệnh POST - vì vậy đó là những gì bộ nhớ đệm proxy làm. Sẽ an toàn khi GET một tài nguyên nhiều lần, vì vậy bạn có các trình tìm nạp trước liên kết làm điều đó. An toàn để đánh dấu và làm mới GET, vì vậy không có cảnh báo nào từ trình duyệt, v.v.,

Điều đó nói rằng không có sự khác biệt về bảo mật - ví dụ về mật khẩu tên người dùng bạn cung cấp không chính xác. POST dễ bị giả mạo hoặc được xem là GET.

+0

Có nhưng không có trong lịch sử và có thể được truy xuất vài tháng sau đó (nếu nó vẫn tồn tại). Một câu hỏi là, nếu tôi làm một get/a nó có thể được lưu trữ và nếu tôi đăng/b kết quả sẽ không được lưu trữ nhưng nếu tôi truy cập/một lần nữa tôi vẫn sẽ ise các dữ liệu cũ trong bộ nhớ cache? sao lưu lại bộ nhớ cache trên miền? hoặc hiện nó chỉ nói dont cache trang cụ thể này? –

+0

@ acidzombie-nó chỉ nói không cache yêu cầu đó. –