■ Http (HyperText Transfer Protocol) là giao thức truyền tải siêu
văn bản, giao tiếp trên cơ sở TCP/IP, được sử dụng để phân phối dữ liệu (các tệp HTML, các file ảnh, …) trong www dùng để truyền tải dữ liệu giữa Web server đến các trình duyệt Web và ngược lại. Giao thức này sử dụng cổng 80 (port 80) là chủ yếu (ngoài ra có thể dùng cổng 8080). Mô hình hoạt động của giao thức HTTP ■ HTTP hoạt động dựa trên mô hình Client – Server. Trong mô hình này, các máy tính của người dùng sẽ đóng vai trò làm máy khách (Client). Sau một thao tác nào đó của người dùng, các máy khách sẽ gửi yêu cầu đến máy chủ (Server) và chờ đợi câu trả lời từ những máy chủ này. Các đặc trưng cơ bản của HTTP ■ HTTP là giao thức connectionless (kết nối không liên tục): một trình duyệt khởi tạo một yêu cầu HTTP từ phía client và sau đó một yêu cầu được tạo ra, Client ngắt kết nối từ Server và đợi cho một phản hồi. Server xử lý yêu cầu và thiết lập lại sự kết nối với Client để gửi phản hồi trở lại. ■ HTTP là một phương tiện độc lập: Nó nghĩa là, bất kỳ loại dữ liệu nào cũng có thể được gửi bởi HTTP miễn là Server và Client biết cách để kiểm soát nội dung dữ liệu. ■ HTTP là stateless: Như đã được đề cập ở trên, HTTP là connectionless và nó một kết quả trực tiếp là HTTP trở thành một giao thức Stateless. Server và Client biết về nhau chi trong một yêu cầu hiện tại. Sau đó, cả hai chúng nó quên tất cả về nhau. Do bản chất của giao thức, cả Client và các trình duyệt có thể giữ lại thông tin giữa các yêu cầu khác nhau giữa các trang web. Cấu trúc cơ bản ■ Giao thức HTTP là một giao thức Yêu cầu/Phản hồi dựa trên cấu trúc Client/Server, các trình duyệt web, các thiết bị tìm kiếm,… hoạt động như các Client, và các Server web hoạt động như một Server. Tiến trình của một phiên làm việc HTTP ■ HTTP client thiết lập một kết nối TCP đến server. Nếu thiết lập thành công, client và server sẽ truyền nhận dữ liệu với nhau thông qua kết nối này, kết nối được thiết lập còn gọi là socket interface bao gồm các thông tin: địa chỉ IP, loại giao thức giao vận (chính là TCP), và port (mặc định là 80). ■ Sau khi kết nối thành công, client gửi một HTTP request đến server thông qua socket interface vừa được thiết lập. Trong gói tin request sẽ chứa đường dẫn yêu cầu (path name) là /category/internet-of-thing. ■ Server sẽ nhận và xử lý request từ client thông qua socket, sau đó đóng gói dữ liệu tương ứng và gửi một HTTP response về cho client. Dữ liệu trả về sẽ là một file HTML chứa các loại dữ liệu khác nhau như văn bản, hình ảnh,… ■ Server đóng kết nối TCP. ■ Client nhận được dữ liệu phản hồi từ server và đóng kết nối TCP. HTTP request ■ Gồm 3 phần chính là: Request line, Header và Body. ■ Request line là dòng đầu tiên của gói HTTP Request, bao gồm 3 trường: phương thức (method), đường dẫn (path – còn gọi là URL hoặc URI) và phiên phản giao thức (HTTP version). – Phương thức (method) có thể là: GET, POST, HEAD, PUT và DELETE. Hai phương thức phổ biến nhất là GET và POST, phương thức GET thường dùng để yêu cầu tài nguyên cung cấp trong trường URL. – Đường dẫn (path) dùng để định danh nguồn tài nguyên mà client yêu cầu, bắt buộc phải có ít nhất là dấu “/”. – Phiên bản giao thức (HTTP version): là phiên bản HTTP client đang sử dụng (thường là HTTP/1.0 hoặc HTTP/1.1) HTTP request ■ Các dòng Header: các dòng này là không bắt buộc, viết ở định dạng “Name:Value” cho phép client gửi thêm các thông tin bổ sung về thông điệp HTTP request và thông tin về chính client. Một số header thông dụng như: – Accept: loại nội dung có thể nhận được từ thông điệp response. Ví dụ: text/plain, text/html – Accept-Encoding: các kiểu nén được chấp nhận. Ví dụ: gzip, deflate, xz, exi… – Connection: tùy chọn điều khiển cho kết nối hiện thời. Ví dụ: Keep-Alive, Close… – Cookie: thông tin HTTP Cookie từ server ■ Body: là dữ liệu gửi từ client đến server trong gói tin HTTP request. Đa số các gói tin gửi theo phương thức GET sẽ có Body trống, các phương thức như POST hay PUT thường dùng để gửi dữ liệu nên sẽ có bao gồm dữ liệu trong trường Body. HTTP response message: ■ Định dạng gói tin HTTP response gồm 3 phần chính là: Status line, Header và Body. ■ Dòng Status line gồm 3 trường là phiên bản giao thức (HTTP version), mã trạng thái (Status code) và mô tả trạng thái (Status text): – Phiên bản giao thức (HTTP version): phiên bản của giao thức HTTP mà server hỗ trợ, thường là HTTP/1.0 hoặc HTTP/1.1 – Mã trạng thái (Status code): mô tả trạng thái kết nối dưới dạng số, mỗi trạng thái sẽ được biểu thị bởi một số nguyên. Ví dụ: 200, 404, 302,… – Mô tả trạng thái (Status text): mô tả trạng thái kết nối dưới dạng văn bản một cách ngắn gọn, giúp người dùng dễ hiểu hơn so với mã trạng thái. Ví du: 200 OK, 404 Not Found, 403 Forbiden,… ■ Các dòng Header line của gói tin response có chức năng tương tự như gói tin request, giúp server có thể truyền thêm các thông tin bổ sung đến client dưới dạng các cặp “Name:Value”. ■ Phần Body là nơi đóng gói dữ liệu để trả về cho client, thông thường trong duyệt web thì dữ liệu trả về sẽ ở dưới dạng một trang HTML để trình duyệt có thể thông dịch được và hiển thị ra cho người dùng. Các phương thức truyền dữ liệu trên HTTP ■ GET: được sử dụng để lấy lại thông tin từ Server đã cung cấp bởi sử dụng một URI đã cung cấp. Các yêu cầu sử dụng GET nên chỉ nhận dữ liệu và nên không có ảnh hưởng gì tới dữ liệu. ■ HEAD: Tương tự như GET, nhưng nó truyền tải dòng trạng thái và khu vực Header. ■ POST: Một yêu cầu POST được sử dụng để gửi dữ liệu tới Server, ví dụ, thông tin khách hàng, file tải lên, …, bởi sử dụng các mẫu HTML. ■ PUT: Tải lên một đại diện xác định của URI. ■ DELETE: Xoá tài nguyên xác định ■ CONNECT: Chuyển đổi các yêu cầu kết nối đến một tunnel TCP/IP Tạo web server trong python ■ Máy chủ web HTTP có nhiệm vụ thực hiện chính xác hai điều: ■ 1- Nghe các yêu cầu http đến trên một địa chỉ TCP cụ thể (địa chỉ IP và số cổng) ■ 2- Xử lý yêu cầu và gửi phản hồi lại cho người dùng. Tạo web server trong python ■ Các bước thực hiện: ■ import module htttp.server của Python vào trong chương trình ■ Khai báo một class kế thừa từ class BaseHTTPRequestHandler ■ Có thể khai báo phương thức do_GET() để xử lý khi có get Request gửi lên nếu không có trang html riêng. ■ cấu hình thông số và các hành động xử lý: httpd= socketserver.TCPServer(("", PORT), Handler) Hoặc httpd = HTTPServer(server_address, SimpleHTTP) ■ Khởi chạy server: httpd.serve_forever() Một số phương thức trong httplib ■ Tham khảo trên : https://docs.python.org/3/library/http.server.html