Giao thức HTTP là gì
HTTP là viết tắt của Hypertext Transfer Protocol. Đó là tập hợp các quy tắc chuẩn dành cho việc truyền và nhận dữ liệu.
Được dùng để liên hệ thông tin giữa Máy cung cấp dịch vụ (Web server) và Máy sử dụng dịch vụ (Web client) là giao thức Client/Server dùng cho World Wide Web-WWW, HTTP là một giao thức ứng dụng của bộ giao thức TCP/IP (các giao thức nền tảng cho Internet).
Ví dụ như khi bạn muốn xem dữ liệu (Nhận) của trang chủ Sociss Class bạn sẽ làm các công việc sau
- Mở trình duyệt lên , lúc này thiết bị bạn sử dụng (điện thoại hoặc máy tính) chính là Client.
- Bạn gõ vào trình duyệt tên miền https://sociss.edu.vn/ sau đó truy cập. Lúc này bạn đã thực hiện một Request (yêu cầu) đến máy chủ của Sociss Class.
- Tại máy chủ của Sociss Class (Server), hệ thống sẽ tiếp nhận yêu cầu của bạn là muốn xem trang chủ và sẽ tìm nạp tệp tin HTML của trang chủ trên đó và gửi trả về cho bạn (Truyền dữ liệu).
- Lúc này tại trình duyệt của bạn sẽ nhận dữ liệu chính là trang HTML mà Server của Sociss gửi về và hiển thị lên trình duyệt.
Toàn bộ quá trình trên chính là các bước tổng quát mà giao thức HTTP thực hiện trên nền TCP/IP.
Hình dung được quá trình trên là cực kỳ quan trọng, vì trong khóa học này mình sẽ hướng dẫn các bạn xây dựng một ứng dụng web với NodeJS trên nền giao thức HTTP này.
Tiếp theo mình xin giới thiệu các thành phần cơ bản trong giao thức HTTP.
1. URLs
Trọng tâm của truyền thông web là thông báo yêu cầu, được gửi thông qua Uniform Resource Locators (URL), dùng để tham chiếu tới tài nguyên trên Internet.
Một URL có cấu trúc như dưới đây.
Protocol : chính là Giao thức sử dụng, thường là HTTP hoặc HTTPs. Trong trường hợp truyền nhận file thì là FTP.
Host : cái này chính là một tên miền hoặc một địa chỉ IP của một máy tính nào đó nơi sẽ xử lý của yêu cầu từ Client.
Port : Số cổng mà server đang chạy để lắng nghe việc xử lý các Request HTTP.
Bạn có thể hình dung một khu phố có rất nhiều ngôi nhà, mỗi ngôi nhà đều có địa chỉ riêng của mình, tương tự máy tính cũng vậy, tại một thời điểm máy tính có thể có rất nhiều phần mềm cùng chạy. Mỗi phần mềm sẽ chạy trên một Cổng (Port) khác nhau. Việc định rõ số cổng chính là việc xác định ứng dụng nào đang chạy trên máy tính đó sẽ xử lí yêu cầu của bạn.
Thông thường dịch vụ web sẽ chạy ở cổng 80 của máy tính theo mặc định.
Resource Path : Đây chính là đường đến tài nguyên, đây là phần cực kỳ quan trọng, xác định tài nguyên nào sẽ được yêu cầu.
Query : Đây là tập các đối số (Param) gửi kèm theo để cung cấp thêm thông tin.
Ví dụ bạn muốn xem trang sản phẩm thông qua ID của sản phẩm thì có thể thực hiện Request sau.
GET /product?id=1234 : Nghĩa là thực hiện một GET request với đối số là id = 1234 . Lúc này tại server sẽ thực hiện một hành động tương ứng là gửi trả về thông tin của sản phẩm với ID là 1234.
→ Chú ý: Ý nghĩa cấu trúc một URL là rất quan trọng trong các bài học về sau khi bạn muốn xây dựng một RESTfull API.
2. HTTP Request methods
Giống như tương tác giữa người với người, khi bạn nói là bạn yêu cầu ai đó thì bạn sẽ phải định rõ yêu cầu là gì, hay cụ thể hơn tùy vào yêu cầu của bạn mà người kia sẽ đáp lại như thế nào.
Giao thức HTTP định nghĩa ra một tập phương thức yêu cầu ( Request methods ) để bạn sử dụng trong việc tương tác với máy chủ . cụ thể là :
GET : GET được sử dụng để lấy thông tin từ Server.
Khi bạn truy câp một trang web từ trình duyệt thông qua URL thì bạn đang thực hiện một GET request trên URL đó để lấy dữ liệu.
POST : Một yêu cầu POST được sử dụng để gửi dữ liệu tới Server.
Khi bạn nhập mật khẩu và password trong một trang web nào đó và nhấp Login, thì lúc này bạn đang gửi dữ liệu của bạn đến máy chủ của trang web đó thông qua phương thức POST.
PUT : Phương thức này được dùng với ý nghĩa là bạn đang thay đổi, cập nhật lại nội dung của một nguồn dữ liệu nào đó.
Ví dụ bạn muốn cập nhật thông tin Profile trong trang Sociss Class, sau khi điền thông tin, bạn nhấp vào Save, thì lúc này mình đang gửi một PUT request tới Server để cập nhật lại thông tin cho các bạn.
DELETE : Phương thức này sử dụng với ý nghĩa bạn muốn xóa một tài nguyên nào đó.
Ví dụ bạn muốn xóa một bình luận của bạn, thì bạn sẽ gửi một DELETE request kèm theo ID của bình luận đó tới Server, lúc này Server sẽ nhận ra là bạn đang muốn xóa sản phẩm với ID đó và thực hiện yêu cầu của bạn.
OPTIONS : Phương thức này thường được gửi đến Server trước mỗi Request POST, PUT, GET , DELETE ở trên để kiếm tra xem Server chấp nhận những yêu cầu loại nào.
Ví dụ với Sociss Class, mình không bao giờ chấp nhận bất cứ yêu Cầu DELETE nào cho khóa học từ client cả, để tránh ai đó xóa khóa học trái phép.
lúc này nếu bạn gửi yêu cầu DELETE. thì yêu cầu OPTIONS sẽ được gửi đầu tiên để kiểm tra mình cho phép những Request Methods nào, khi trả về kết quả thì không có DELETE trong đó. Lúc này trình duyệt sẽ báo lỗi là Server không chấp nhận DELETE request và từ chối yêu cầu.
HEAD : Phương thức này chỉ lấy về phần Header của tài nguyên không có phần thân (Body) , thường dùng để kiểm tra thông tin của tài nguyên đó , ứng dụng nhiều trong việc Caching của trình duyệt.
Hãy nhớ và hiểu ý nghĩa của các Method Request mình đề cập ở trên, vì nó rất quan trọng trong việc xây dựng một hệ thống web.
3.Status Code
Tiếp theo kế sau các Request Methods chính là các Status Code ( Mã trạng thái ).
Mã trạng thái là một con số để xác định trạng thái sau khi thực thi một yêu cầu HTTP.
Ví dụ: bạn thực hiện một yêu cầu GET đến https://sociss.edu.vn/ . Lúc này bạn sẽ nhận được một nội dung trang web và một mã status code là 200. Ý nghĩa rằng yêu cầu của bạn đã thành công.
Cấu trúc mã Status Code chia thành các loại dưới đây.
2xx: Successful (Thông báo thành công)
3xx: Redirection (Yêu cầu chuyển hướng)
4xx: Client Error (Người dùng gặp lỗi)
5xx: Server Error (Server gặp lỗi)
Ví dụ
+ Khi bạn yêu cầu tạo một bình luận thì nếu tạo thành công server sẽ gửi về mã 201 Created.
+ Khi bạn truy cập vào một URL không tồn tại thì sẽ nhận được một Status Code là 400 : Not found.
+ Khi bạn thực hiện một yêu cầu cần đăng nhập mà bạn chưa đăng nhập thì sẽ nhận mã 401 yêu cầu bạn đăng nhập.
+ Khi Server bị lỗi nào đó từ yêu cầu của bạn, như là chia cho 0 chẳng hạn, lúc này server sẽ bị lỗi và trả về lỗi 500.
Các bạn có thể tùy theo các loại mã trả về từ Server mà có thể lập trình ra các hành động phù hợp.
Cụ thể là nếu nhận lỗi 400 thì ở Client bạn có thể thông báo cho người dùng một tin nhắn là “Tài nguyên bạn tìm kiếm là không tồn tại”
Chi tiết về danh sách mã lỗi bạn xem tại đây nhé .
Bạn có thể đọc thêm sâu hơn về các thành phần bên trong một gói tin HTTP tại đây nhé.
4. Cấu trúc một gói tin HTTP
Cấu trúc một gói tin HTTP bao gồm các thành phần sau.
- Request Line : Chứa Request method và đường dẫn URL của tài nguyên đích.
- Header: Chứa các thông tin của thiết bị thực hiện Request này.
- Body : Phần thân chứa dữ liệu của Request.
Ví dụ :
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: www.sociss.edu.vn
Connection: Keep-Alive
Như bạn thấy trong ví dụ trên chính là mô tả một gói tin GET được gửi lên từ máy chủ Sociss Class.
Trong thực tế bạn có thể đọc thông tin một Request từ trình duyệt thông qua Debug Tool của trình duyệt đó, Ví dụ với Chrome hoặc Opera
bạn nhấn tổ hợp phím Ctrl + Shift + I để mở Debug Tool.
Sau đó nhấp vào Tab Network để xem tất cả Request được thực hiện, nhấp vào mỗi Request để xem đầy đủ thông tin của nó.
Đây là một cách để bạn có thể kiểm tra dữ liệu nhận hoặc gửi có chính xác không trong lúc lập trình.
Kết Luận
Qua bài viết trên mình đã đem đến cho các bạn kiến thức đủ để hiểu về HTTP, đây là phần vô cùng qua trọng trong việc phát triển một ứng dụng Web, chỉ khi bạn hiểu nó thì bạn mới có thể xây dựng được một ứng dụng web tốt.
Nguyễn Hữu Quyền
Đà Nẵng, 27 tháng 9 năm 2017