Hai method GET và POST là hai phương thức của giao thức HTTP, được dùng phổ biến. Trong lập trình web nó hay đi kèm với thẻ <form>
(một thẻ trong HTML), việc chỉ định method trong thẻ <form method="POST">
giúp form đó request tới action với method đã set. Ngoài ra khi làm việc với RESTful API thì đây cũng chính là hai method chính được dùng nhiều nhất. Vậy câu hỏi đặt ra GET và POST khác nhau như thế nào? Và có gì lưu ý khi dùng chúng hay không? Vậy hôm nay mình sẽ nói chút về hai method này.
Trước tiên các bạn hãy thử trả lời các câu hỏi sau xem mình đúng tới đâu nhé.
GET và POST - những câu hỏi
- Parameter (tham số) của method nào sẽ được lưu lại trong session history hoặc history của trình duyệt?
- Method nào giới hạn độ dài ký tự có thể gửi lên server?
- Method nào dùng để gửi dữ liệu “nhạy cảm” và tại sao lại dùng method đó?
- Method nào chỉ có thể chấp nhận ký tự loại ASCII?
- Method nào có thể bookmark lại (lưu bookmark á)?
- Method nào có body?
- Nếu làm static website thì website đó chỉ có thể dùng method nào?
- Method nào là được gọi là “safe method”?
- Method nào mà trình duyệt của người dùng có thể cache dữ liệu?
- Method nào không thể truy cập trực tiếp bằng trình duyệt?
GET
Nói dễ hiểu, khi bạn mở trình duyệt và gõ url google.com chẳng hạn thì lúc này trình duyệt sẽ tạo một request với method GET tới google.com. Lúc nhập vào ô tìm kiếm và nhấn enter trình duyệt sẽ lấy nội dung bạn vừa gõ và gửi đi.
Ví dụ bạn cần tìm kiếm từ khóa sad
sau khi nhập và bấm enter, trình duyệt sẽ “mã hóa” và request tới server với đường dẫn như sau sẽ hiển thị lên thanh địa chỉ: https://www.google.com/search?q=sad&oq=sad
với q
vào op
là những tham số.
Như các bạn có thể thấy dữ liệu gửi đi format về dạng key = value
và dùng dấu ?
để nối vào url chính, ngăn cách giữa các key-value là dấu &
.
POST
Với post, khi bạn muốn gửi hai tham số p
và op
thì nó sẽ không show lên thanh địa chỉ của trình duyệt mà nó sẽ được gửi “ngầm” ở dưới.
Trả lời những câu hỏi
Ở trên mình chỉ nói sơ qua về GET và POST để các bạn hình dung nó là gì, các bạn có thể tìm hiểu thêm về nó trên mạng nhé. Còn sau đây mình sẽ trả lời những câu hỏi bên trên.
1. Gửi parameter dùng GET sẽ được lưu lại trong trình duyệt
Bây giờ các bạn thử các link search google phía trên xem, dán nó vào trình duyệt, sau đó vào history xem, bạn sẽ nhớ ra bạn đã search gì nếu nhìn thấy q=sad
:)))
Đối với các loại web đời mới như SPA, PWA thì GET method sẽ được lưu vào session history của trình duyệt.
2. GET giới hạn số ký tự được gửi đi
Thông thường phụ thuộc vào vài yếu tố khác như nhân trình duyệt, …. Độ dài thường là 2048 ký tự (bao gồm cả domain các kiểu nữa). Với GET dữ liệu gửi đi chỉ có thể là ký tự ASCII nên không thể gửi binary hay images đồ được.
Với POST thì rất thỏa mái, do có body nên ưng gửi gì trong đó cũng được, và không giới hạn độ dài.
3. Method POST thường dùng để gửi dữ liệu nhạy cảm
Uhmmmm, POST không show parameter gửi đi lên thanh địa chỉ là một trong số lý do đó.
Ngoài ra lý do chính là POST không bị cache và không được lưu lại trong history. Thử nghĩ nếu bạn gửi dữ liệu với username và password bằng GET, nó sẽ lưu lại vào history và bị cache lại. Nhỡ ai vô tình mở history của trình duyệt thì há chẳng phải thấy username với password nằm chính ìm đó sao, thêm nữa, chức năng suggestion url của trình duyệt, vừa gõ vài từ nó show nguyên url đó ra :)))
Ngoài ra, vài web server hoặc gateway thậm chí là IPS sẽ lưu log bạn truy cập lại nên dùng GET gửi dữ liệu nhạy cảm thì nó sẽ nằm trong log của họ đó nha.
4. GET chỉ chấp nhận lý tự ASCII
Như đã nói ở trên, nên GET không thể gửi kiểu khác được.
5. GET có thể đánh dấu bookmark lại được.
Vì vài lý do đã nêu phía trên, (dữ liệu nhạy cảm trong parameter) và không lưu parameter lại, nên có bookmark rồi thì lúc request lại cũng chẳng thể được, vì thiếu parameter.
6. POST có request body
Như đã nêu ở trên
7. Nếu là static website thì website đó chỉ có thể dùng GET (có thể có ngoại lệ cho HEAD)
Định nghĩa về static website thì nói dễ hiểu, nó chẳng xử lý mịa gì cả, chỉ trả về html css thuần mà thôi, blog của mình nè, méo có database hay code xử lý gì đâu.
Chính vì chỉ trả dữ liệu không thôi, nên nó chỉ có GET mà thôi.
8. GET được gọi là “safe method”
Thuật ngữ safe method ra đời với RESTful, ám chỉ một method nào đó của phương thức HTTP mà khi sử dụng nó không thay đổi dữ liệu gì ở phía server. Dễ hiểu là method chỉ đọc (read-only). Chính vì thế nên GET được gọi là safe method vì nó méo thay đổi gì ở server cả. Trừ khi :))) tui nghĩ các bạn biết cái trừ khi đó rồi, ý bảo dùng GET để gửi dữ liệu lên, update gì đấy trên server chứ gì. Code vậy là không theo chuẩn RESTful nhé.
Ví dụ đơn giản về dùng method the chuẩn RESTful.
POST
để save hoặc send data lên server, chủ yếu để tạo mới.PUT
để update dataPATCH
cũng để update data nhưng update 1 phần mà thôi, ví dụ dùng put để update tất của thông tin của một cuốn sach, dùng path khi chỉ muốn update cái tên sách mà thôi.- …
9. Response của method GET có thể cache lại trên trình duyệt
Thường sẽ có cách để nó không cache lại. Cơ mà nếu ứng dụng được điều này thì website sẽ load nhanh cực kỳ. Điển hình nhất là static website.
10. POST không thể truy cập trực tiếp bằng trình duyệt
Có lý do tương đồng với việc không thể bookmark.
Tóm lại
Thường GET sẽ dùng cho việc đọc dữ liệu, còn POST cho việc send và save, chính vì thế nên cân nhắc mỗi khi sử dụng chúng để chọn ra cái tốt nhất.