Gần đây em có đi phỏng vấn và nhận được 1 câu hỏi “Liệu có thể dùng method post để chỉ lấy dữ liệu từ db hay không(fetch data)”. Em trả lời là trên lý thuyết thì hoàn toàn có thể được nhưng sẽ bị kém về mặt hiệu năng. Người phỏng vấn sau đó có giải thích cho em, họ không nói rõ là được hay không mà chỉ giải thích là gây ra vấn đề về “stable”. Họ có nói thêm là trong trường hợp này với phương thức get thì khi gửi 100 request kết quả vẫn sẽ như vậy nhưng khi gửi post request thì lần thứ nhất và lần thứ 2 đã khác nhau rồi. Liệu các bạn,anh chị lướt qua post này hiểu sâu có thể giải thích rõ vấn đề trên, mình cảm ơn.
Dùng method post để fetch data
Theo lý thuyết là được, Controller phía backend thiết kế nhận http request POST và chỉ select data từ DB để response về.
Theo thực tế cũng đúng luôn, theo nguyên tắc RESTful thì với http POST dev sẽ hiểu đây là method dùng để insert DB (hoặc update, delete cũng được) sẽ gây thay đổi data trong DB.
Thực ra thì nếu 1 câu khi trả lời mà vừa đúng vừa sai tuỳ vào hoàn cảnh như câu pv vừa rồi thì câu trả lời của bạn chủ topic là chính xác 100% và chuẩn hơn giải thích của người PV vì người PV đặt giả định tình huống dùng post thay cho get chứ không nói về việc implement logic xử lí. Nếu theo giải thích của người PV thì method nào cũng không stable hết vì nó phụ thuộc vào implementation ở phía controller. Còn nếu chỉ hỏi về khái niệm thì giải thích như bạn là hợp lí
Bạn phải hiểu là đã suy ra từ người phỏng vấn là được, như “về mặt lý thuyết” bạn đã nắm, chứ sao nghe như có vẻ như là bạn đang thiên về hướng… POST thì không được, nếu không được thì còn bàn gì stable nữa bạn, ông phỏng vấn đâu có ngáo?
Tự nhiên đi làm cho phức tạp vấn đề làm gì không biết nữa. Cứ mở giao thức HTTP ra xem giải thích phần POST, GET thì thấy có những cái làm được nhưng không nên làm, kiểu con người bò 2 tay 2 chân (tương đương với POST đang bàn) thì di chuyển được chú sao không, nhưng bình thường 1 người ra đường thì họ nên di chuyển bằng 2 chân (GET). Đó là giải thich theo ngôn ngữ so sánh đời thường, mình thường giải thích với team như vậy, dù họ có based IT, còn mình không phải dân IT. Và mình cũng nhấn mạnh luôn, bạn nào muốn tham gia giải Marathon và bò “4 chân” thì anh em góp tiền mua BIB cho
Còn về mô thả HTTP thì như sau:
GET gửi dữ liệu trong phần header của một HTTP request và có thể cache nên gửi 100 phát nhưng có 50 giống nhau thì nhẹ hều tải cho server.
POST gửi dữ liệu trong phần BODY của HTTP request, và không cache, nên nếu gửi 100 phát thì server bị gõ đầu 100 cú, chịu tải khá nặng, lên 1000 request thì sập luôn hông chừng.
Cache ở đây là nói theo thiết kế mặc định của giao thức HTTP và các xử lý của trình duyệt khi chưa có sự “hack” nào vào., bỏ qua mấy thứ trick này nọ.
Bỏ qua các khía cạnh khác GET vs POST như bảo mật, gói tin to nhỏ vì ngoài phạm vi topic này.
Túm lại thì các thứ đươc trang bị cũng như bộ dụng cụ gia đình, hoặc 18 món binh khí vậy, có thể món nọ sử dụng thay thế được món kia trong tình huống nào đó, nhưng là người thợ, võ sĩ thông thường thì cần hiểu rõ để sử dụng cho nhuần nhuyễn cái đá, chừng nào ở mức nghệ nhân, cao thủ võ lâm thì tính sau. Ở đây, cứ theo lý thuyết và các ví dụ mà dùng GET hoặc POST, đừng cố chơi ngông làm ngược lại làm gì, không ai khen mà còn ăn chửi. Trong trường hợp phỏng vấn ở trên, cũng đừng dại mà nói vì thấy người ta làm vậy nên bắt chước theo mà không hiểu cái đó thì cũng đáng ăn chổi lông gà. Cái nào chưa/ không biết nói không biết, cám ơn người ta và nói với họ sẽ về tìm hiểu kỹ hơn, nếu họ buộc phải trả lời ngay mà thiếu kiến thức thì cũng thành thật với họ là theo suy luận/ đọc đâu đó thì… nhưng cái này cũng không chắc, xin được giải thích rõ hơn, nếu thời giờ hạn hẹp thì có thể được email sau… Mấy ông phỏng vấn phổng mũi, khoái. Ngày trước mình đi phỏng vấn kiểu vậy vì đã > 30 mới đi làm IT và không có bằng cấp gì.
Còn cảm thấy lơ mơ thì tìm sách mà đọc, có nhiều bạn trẻ học cái gì mà đọc mấy bài có viết vài trăm chữ mà đã nản, thì làm sao mà có kiến thức đủ rộng và sâu được? Có những kiến thức dạng nền tảng thì phải trang bị chứ đến lúc cần mới rối lên thì làm sao mà bổ sung cho kịp, chuyện đến khi vào phòng thi cấp 3 làm toán mới đi học Bảng Cửu chương thì thế nào? Về CNTT cũng vậy, có những cái thuộc nền tảng, phải học cho kỹ. Nhiều bạn thần thánh hóa cách học dạng visual (tức là xem clip, xem hình là chính, không đọc text) rồi cho rằng đọc sách là cách quá cổ, kém hiệu quả… Khi bị bật lại, họ cũng không giải thích được vì sao sách đã tồn tại hơn 4000 năm, và liệu 4000 năm nữa thì màn hình có còn tồn tại?
Câu trả lời này đúng mấu chốt của vấn đề
Câu hỏi này khá rộng, nếu chỉ trả lời vào trọng tâm của câu hỏi, dùng post để lấy data thay vì get có được hay không, thì câu trả lời hoàn toàn được, chỉ cần muốn là được
Người phỏng vấn đưa ra một cái giả định data thay đổi sau mỗi lần post để bắt chẹt ứng viên như này, mình đánh giá không cao
có thể? có
có nên? ko vì method get được tạo ra để làm điều đấy.
chửi lại tên pv hỏi gì ngốc vậy
với lại ai bảo đảm gửi get 100 lần kết quả vẫn y hệt? Method get vẫn có thể thay đổi db được, toy thích thì toy đổi thoy. Nhưng có nên hay ko? Ko nên vì khi user share link với nhau thì họ thường copy paste cái url, cùng 1 url mà ra khác kết quả thì người ta chửi web dỏm lừa đảo. Nên tạo ra 1 method khác gửi data ko có hiện trên url, gọi đó là method post Với lại cùng get 100 lần mà lần thứ 2 giảm giá sale (db bị người khác làm thay đổi) thì làm gì có chuyện get 2 lần vẫn ra kết quả y hệt
Những câu hỏi mà ứng viên chưa hiểu rõ thì hỏi lại để ngươi hỏi diễn đạt tốt hơn, và ý mình hiểu cũng nên phản hồi cho họ biết, sau đó trả lời vào trọng tâm.
Thiệt sự là mình cũng không chắc người phỏng vấn ở đây họ muốn gì luôn hoặc chủ topic ghi lại không chính xác câu hỏi bởi vì GET hoặc POST thì không liên quan DB, ai biết được bên server có dùng DB hay không? Data và DB là khác nhau chứ nhỉ? Có khi nào mình lạc hậu mất rồi, web hiện đại đã cho phép móc JavaScript trên trình duyệt kết nối trực tiếp đến DB thông qua giao thức HTTP mà không cần phải thông qua web server?
hình như bạn trả lời bị lạc đề câu hỏi của mình rồi. trước đó người phỏng vấn đã hỏi về api và các http method rồi. Họ muốn giả định chúng ta muốn cố đấm ăn xôi dùng method post thay cho method get thì liệu có được không. Còn http method thì ai mà chả biết.
ý người phỏng vấn đang muốn hỏi bạn có hiểu về tính chất idempotent của REST API hay không.
nhưng người phỏng vấn có vẻ cũng không hiểu idempotent chỉ áp dụng cho chuẩn RESTful chứ không phải các request thông thường (lý do vì sao @tntxtnt đã nói) , nên hỏi sai bét
HTTP method là cái gì? Mình thực sự chưa biết đến cái này thì làm sao mà đề cập. Bạn đọc lại xem. Và bạn cũng mới lòi thêm thông tin là cuộc phỏng vấn có thêm dữ kiện. Như vậy, ai là người lạc đề? Mình chỉ muốn nói là bạn phải hiểu đúng người phỏng vấn muốn hỏi gì, từ đó mới có thể có hướng trả lời, chỉ như vậy.
Mình cho rằng câu hỏi phỏng vấn kia duòng như có gì đó trục trặc, nếu nó là nguyên văn thì người hỏi cũng không am hiểu lắm anh ấy/ cô ấy đang hỏi cái gì, còn nếu là bạn bị hỏi câu như vậy mà bạn thấy JavaScript ở client có gửi request tới databsse mà bạn không hỏi lại thì cũng lạ. Vì POST, GET không được thiết kế để móc nôi đến database mà chỉ được thiết kế để giao tiếp với HTTP Server (thường được gọi thành Web Server và tạo ra vài cách hiểu khác nhau).
Mình tán thành với trả lời trên. Nhưng cũng phải thòng thêm là có thể… nhưng, vì nếu POST bị server từ chối thành không thể. Hoặc nói vui là Hỏi: có thể? Đáp: có thể
Việc POST thay GET có được hay không thì cần phải xem bên server side trả lời lại như thế nào. Có nhiều truòng hợp chấp nhận cả GET, POST và trả về cùng dữ liệu, nhưng nhiều trường hợp, trên server side script kiểm tra thấy không đúng giao thức, nó chỉ chấp nhận GET mà POST lên thì nó không trả lời hoặc báo lỗi.
Người phỏng vẫn chắc muốn nói đến “idempotent” mà có vẻ người PV cũng chả biết giải thích thế nào cho đúng.
Dùng post hoàn toàn được. một số ngân hàng có policy chỉ được dùng POST để get/update dữ liệu
Mình tính sơ sơ trên đây mới 6 người mà 12 ý kiến rồi
Theo ngu ý của mình thì mình đồng tình với bạn @tntxtnt nhất
Thay vì hỏi được hay không thì nên hỏi có nên hay không.
Còn về thiết kế, cách xử lí mặc định thì cứ đọc theo rfc thôi. Vì đa phần các phần cache, proxy đều có để mặc định như thế, đương nhiên là không phải không có ngoại lệ.
-1 cho người phỏng vấn
Thêm thông tin cho bạn để đi combat với người phỏng vấn thì graphql dùng post để fetch data
Lâu rồi mới quay lại post này, nay rảnh rỗi đọc qua mấy bài trên mạng thấy đúng là câu trả lời rất đắt, chỉ cần 1 từ khóa “idempotent” để nói chính xác nhất về vấn đề này, mình xin để đây 1 bài viết để giải thích cụ thể cho vấn đề.
Sau khi đọc lại tất cả thì thấy chủ đề này rất thiếu thông tin bởi vì từ khoá topic chỉ programming, JavaScript, không thấy nói chạy ở trình duyệt/ chạy trong môi trường NodeJS và trong nội dung topic không bàn đến RESTful.
Do đó, liệu Idempotent có phải là câu trả lời?
Cho nên, khi đi phỏng vấn gặp những câu như này cần yêu cầu cung cấp thêm bối cảnh. Hoặc trình bày lên diễn đàn này cũng viết cho rõ, cung cấp kha khá thông tin để người đọc hiểu vấn đề ở đây là gì. Ngày nay, rất nhiều bạn rất kiệm lời, trình bày thiếu sót, lôm côm, sau khi luồng thảo luận đi hàng tá comment lại “lòi ra” cái gì đó mà họ mặc định ở đây ai cũng đọc được (dù ở trong đầu của họ).
Phỏng vấn ở đây cũng phải nêu rõ cấp độ nào, vị trí công việc. Giống như bên Toán vậy, cũng bài toán đó (ví dụ: bài gà chó 36 con bó lại cho tròn 100 chân) học sinh tiêu học giải khác, lên học cấp 2 giải khác. Phỏng vấn dành cho Freshman, Junior, Senior khác nhau, và có khi lại không phải là lập trình viên mà làm cái gì đó như BA, Tester.
Chúng ta đang cãi nhau loạn xạ cả lên vì mỗi người hiểu một kiểu do thiếu thông tin.
Trong khi mình đọc hiểu topic và chỉ xoáy vào JavaScript chạy trên trinh duyệt web khi dùng XMLHttpRequest hoặc Fetch API để gửi một request tới server, dùng method là GET hoặc POST mà thôi.
Trong khi đó, các bạn đang tham gia topic này lại rất hứng thú với RESTful. Nếu lại có thêm vài bạn khác đang hứng thú SOAP, GraphQL nữa thì sao? Những cái này lại không được xem là type of HTTP protocol mà chỉ được xem là architectural style, vậy là chủ đề đã đi quá xa/ quá rộng?
Quay lại, theo chủ topic, câu hỏi nguyên văn: “Liệu có thể dùng method post để chỉ lấy dữ liệu từ db hay không(fetch data)”. Câu trả lời là KHÔNG THỂ NÓI ĐƯỢC hoặc *TUI KHÔNG BIẾT sẽ là câu trả lời ngắn gọn, đáp ứng được yêu cầu.
Thử trả lời kiên nhẫn hơn, lần nữa câu “dùng post để chỉ lấy dữ liệu từ db hay không (fetch data)”:
- Nếu có bàn đến SOAP, RESTful, GraphQL gì đó thì đọc tài liệu bên back-end cung cấp xem back-end có trả lời POST không rồi tính tiếp.
- Nếu chỉ nói về POST, tui không chắc chuyện gì xảy ra khi back-end/ web server không có phản hồi.
- DB đây nghĩa là gì? Theo tui hiểu nếu POST thực hiện ở browser sẽ không làm gì kết nối được tới DB (theo nghĩa DB được quản lý bởi 1 DBMS như Oracle, SQL Server, MySQL) nằm ở back-end nếu không có những bổ sung khác từ trình duyệt.