2009-07-31 66 views
36

Tôi mới tham gia lập trình web và chỉ tò mò muốn biết các phương thức Nhận và Đăng abt gửi dữ liệu từ trang này đến trang khác.Tại sao phương thức GET nhanh hơn POST trong HTTP?

Người ta nói rằng phương pháp Nhận nhanh hơn Đăng nhưng tôi không biết tại sao lại là một lý do tôi có thể tìm thấy là Get chỉ có thể lấy 255 ký tự với nó? Có lý do nào khác không, xin ai đó giải thích cho tôi?

+9

Bạn nên chọn GET so với POST dựa trên việc hành động có tác dụng phụ hay không, không có bất kỳ sự khác biệt về hiệu suất được nhận thức nào. – Draemon

Trả lời

38

Tốc độ không nhiều về tốc độ. Có rất nhiều trường hợp POST được áp dụng nhiều hơn. Ví dụ: công cụ tìm kiếm sẽ lập chỉ mục GET URL và trình duyệt có thể đánh dấu chúng và làm cho chúng hiển thị trong lịch sử. Do đó, nếu bạn thực hiện các hành động như sửa đổi DB dựa trên yêu cầu GET, nó có thể có hại vì một số bot cũng có thể duyệt qua URL.

Trường hợp khác có thể là vấn đề bảo mật. Nếu bạn đăng thông tin đăng nhập bằng GET, nó sẽ được liệt kê trong lịch sử trình duyệt và tệp nhật ký máy chủ.

+0

cách thức hoạt động của các phương thức này là có một số loại serialization được sử dụng để lưu trữ các giá trị và sau đó deserialization cho việc lưu trữ dữ liệu. –

+1

Để gửi biểu mẫu đơn giản, cả hai đều dựa vào các cặp khóa giá trị. GET nhúng chúng vào chính URL đó (chuỗi truy vấn) và POST gửi nó trong phần thân của yêu cầu. –

+0

Sau đó, có các vấn đề về độ dài của URL. Ngay cả khi bạn đang thực hiện một hành động có thể là GET (giống như tra cứu tìm kiếm đơn giản), bạn bị ràng buộc bởi độ dài của những gì được GET cho phép và có thể buộc phải chọn POST. – demongolem

9

Nhìn vào giao thức http, POST hoặc GET phải dễ dàng và nhanh chóng để phân tích cú pháp. Tôi sẽ tranh luận, không có sự khác biệt về hiệu suất.

Hãy nhìn vào các tiêu đề HTTP liệu

http GET

GET /index.html?userid=joe&password=guessme HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 

http POST

POST /login.jsp HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 
Content-Length: 27 
Content-Type: application/x-www-form-urlencoded 

userid=joe&password=guessme 

Từ quan điểm của tôi, hiệu suất không nên được xem xét khi so sánh GET và POST.

+7

GET ít gói hơn POST. Hiển thị trong ví dụ của bạn. Luôn luôn gói nếu ít hơn sau đó nhanh hơn để xử lý. Các gói tin lớn hơn ngay cả trong một byte duy nhất là ít nhất một nơi nào đó trong memor/cpu thực hiện thêm của nó. Vì vậy, so sánh GET hoặc POST, tôi sẽ nói theo kích thước gói GET sẽ nhanh hơn. – YumYumYum

+0

@YumYumYum +1. Trong ứng dụng GET của tôi nhanh gấp 2 lần POST! –

0

POST sẽ phát triển tiêu đề của bạn nhiều hơn, chỉ cần làm cho nó lớn hơn, nhưng sự khác biệt phải là không đáng kể thực sự, vì vậy tôi không thấy lý do tại sao điều này nên là một mối quan tâm.

Chỉ cần nhớ rằng cách thích hợp để nói HTTP là sử dụng GET chỉ cho các hành động và POST cho dữ liệu. Bạn không cần phải làm như vậy, nhưng bạn cũng không muốn có một trường hợp mà các bot của Google có thể chèn, xóa hoặc thao tác dữ liệu chỉ dành cho con người để xử lý đơn giản bởi vì nó đang theo các liên kết mà nó tìm thấy .

+0

Điều này không hoàn toàn đúng. Để làm rõ: GET có nghĩa là không có giá trị và thường không có cơ thể. POST không nhất thiết phải là ngẫu nhiên và thường có một cơ thể. Lưu ý, tôi nói rằng GET "nói chung" không có cơ thể vì thông số HTTP không cho phép nó (IIRC) nhưng hầu hết các máy chủ có thể sẽ bỏ qua nó. – Tom

24

Có một số quan niệm sai về GET và POST trong HTTP. Có một khác biệt chính, GET phải là idempotent trong khi POST không phải là. Điều này có nghĩa là GET không gây ra tác dụng phụ, tức là tôi có thể gửi GET tới ứng dụng web nhiều lần như tôi muốn (nghĩ nhấn Ctrl + R hoặc F5 nhiều lần) và yêu cầu sẽ là 'an toàn'

Tôi không thể làm điều đó với POST, POST có thể thay đổi dữ liệu trên máy chủ. Ví dụ: nếu tôi đặt hàng một mục trên web, mục sẽ được thêm bằng POST vì trạng thái được thay đổi trên máy chủ, số lượng mục tôi đã thêm đã tăng lên 1. Nếu tôi đã làm điều này với POST và nhấn làm mới trong trình duyệt, trình duyệt cảnh báo tôi, nếu tôi làm điều đó bằng GET, trình duyệt sẽ chỉ gửi yêu cầu. Trên máy chủ GET và POST là quy ước thuần túy, tức là tùy thuộc vào tôi với tư cách là nhà phát triển để đảm bảo rằng tôi mã POST trên máy chủ để không phải lặp lại cuộc gọi. Có nhiều cách khác nhau để làm điều này nhưng đó là một câu hỏi khác.

Để thực sự trả lời câu hỏi nếu tôi sử dụng GET hoặc POST để thực hiện tác vụ tương tự, không có sự khác biệt về hiệu suất.

Bạn có thể đọc các RFC (http://www.w3.org/Protocols/rfc2616/rfc2616.html) để biết thêm chi tiết.

+0

Cảm ơn đề xuất của bạn rằng POST được sử dụng để cuộc gọi lặp lại không thể xảy ra ở phía máy chủ. –

+0

Đó không phải là những gì ông nói thẳng thắn, đăng COULD dẫn đến thay đổi, tuy nhiên không có bài đăng đảm bảo thay đổi bất cứ điều gì, có thể là do đăng dữ liệu tối ưu hơn cho trường hợp sử dụng hơn là sử dụng url. mà tiểu bang đăng bài thay đổi một cái gì đó –

7

Bạn nên nghĩ GET là "một nơi để đi" và POST là "đang làm điều gì đó". Ví dụ: biểu mẫu tìm kiếm phải được gửi bằng GET vì trang kết quả tìm kiếm là "địa điểm" và người dùng sẽ muốn đánh dấu trang hoặc truy xuất biểu mẫu đó từ lịch sử của họ vào một ngày sau đó. Nếu bạn gửi biểu mẫu bằng POST, người dùng chỉ có thể tạo lại trang bằng cách gửi lại biểu mẫu. Mặt khác, nếu bạn đã thực hiện một hành động như nhấp vào nút xóa, bạn sẽ không muốn gửi điều này bằng GET, vì hành động sẽ được lặp lại bất cứ khi nào người dùng quay lại URL.

39

Một điều khác về bài đăng http có thể là 2 cuộc gọi khi tiêu đề http Expect: 100-Continue được sử dụng. Trình duyệt đầu tiên gửi tiêu đề bài đăng http và trả lời máy chủ với "Tiếp tục HTTP 100". Khi trình duyệt nhận được điều này, nó sẽ gửi cơ thể thực.

http://omaralzabir.com/atlas_2__http_post_is_slower_and_it_s_default_in_atlas/

Tôi nghĩ đây là câu trả lời mà tác giả đang tìm kiếm.

+1

Điều này chắc chắn là câu trả lời tôi đang tìm kiếm. Cảm ơn! – nrodic

+0

guys, ** bạn có chắc chắn ** ??? Hai yêu cầu ?? Nó là vô nghĩa! https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods. Đối với dữ liệu phương thức GET chỉ có thể được chuyển trong phần 'truy vấn' của tiêu đề của yêu cầu. Đối với yêu cầu POST - dữ liệu được truyền trong phần thân của yêu cầu và khi bạn gửi dữ liệu bằng cách sử dụng 'Content-Type = application/x-www-form-urlencoded', các yêu cầu sẽ có cùng kích thước (trong hầu hết các trường hợp - POST lớn hơn). Nhưng sự khác biệt là ** không đáng kể **, ít hơn mili giây cho mỗi 10 000 yêu cầu ... – maxkoryukov

1

GEThơi nhanh vì các giá trị được gửi trong tiêu đề không giống như các POST các giá trị được gửi trong yêu cầu cơ thể, trong định dạng kiểu nội dung quy định cụ thể.

Thông thường các loại nội dung là application/x-www-form-urlencoded, vì vậy cơ thể yêu cầu sử dụng định dạng tương tự như chuỗi truy vấn:

tham số = giá trị & cũng = khác Khi bạn sử dụng một tập tin tải lên trong biểu mẫu, thay vào đó, bạn sử dụng mã hóa nhiều phần/biểu mẫu dữ liệu, có định dạng khác. Nó phức tạp hơn.

1

Tôi đồng ý với các câu trả lời khác, nhưng không đề cập rằng yêu cầu GET có thể được lưu trong khi yêu cầu POST không bao giờ được lưu trong bộ nhớ cache. Tôi nghĩ rằng đây là lý do chính cho một số yêu cầu GET được thực hiện nhanh hơn. (Tất-thô này có nghĩa là đôi khi không có yêu cầu thực sự được gửi Do đó nó không phải là thực sự là yêu cầu GET mà là nhanh hơn, nhưng bộ nhớ cache của trình duyệt..)

phương pháp HTTP: GET vs POST: http://www.w3schools.com/tags/ref_httpmethods.asp

5

Just vài xu của tôi từ năm 2016.

Tôi đang tạo một hệ thống tin nhắn đơn giản. Lúc đầu, tôi sử dụng POST để nhận thông báo mới. Trong jQuery tôi có:

$.post('/a/alerts', 'stamp=' + STAMP, function(result) 
{ 
}); 

Và bằng PHP tôi đã sử dụng $ _POST ['stamp']. Ngay cả từ localhost tôi cũng nhận được 90-100 ms cho mọi yêu cầu như thế này. Tôi chỉ cần thay đổi:

$.get('/a/alerts?stamp=' + STAMP, function(result) 
{ 
}); 

và bằng PHP chuyển sang $ _GET ['stamp']. Vì vậy, ít hơn 1 phút thay đổi. Bây giờ mọi yêu cầu đều có 30-40 ms.

Vì vậy, NHẬN có thể nhanh gấp hai lần POST. Tất nhiên không phải lúc nào, nhưng đối với một lượng nhỏ dữ liệu tôi nhận được kết quả tương tự mọi lúc.

Các vấn đề liên quan