Khi một trình duyệt thực hiện một yêu cầu HTTP, nó sẽ trông như thế này:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
Máy chủ mà máy chủ sẽ gửi phản hồi giống như thế này:
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
Bất kỳ mã nào chạy trên máy chủ lắng nghe yêu cầu trên ổ cắm TCP, đọc yêu cầu và trả lời với phản hồi thích hợp sẽ đủ. Một cách ngu ngốc là chỉ đưa ra phản hồi đóng hộp cho bất kỳ ai kết nối với cổng TCP 80, sử dụng tập lệnh shell:
$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
RESPONSE
Tất nhiên, kỹ thuật đó chỉ xuất hiện để tuân thủ giao thức HTTP .
Một bước tiến từ phản ứng đóng hộp đó là chương trình Python đơn giản này, sử dụng http.server
thư viện trong Python 3.
#!/usr/bin/python3
import http.server
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=UTF-8')
self.send_header('Content-Length', len(payload))
self.end_headers()
self.wfile.write(payload)
http.server.HTTPServer(('', 80), Handler).serve_forever()
Máy chủ HTTP có thể được viết bằng bất kỳ ngôn ngữ nào; đó chỉ là một ví dụ Rõ ràng, ví dụ này rất thô sơ. Tải trọng được mã hóa cứng - chương trình hoàn toàn bỏ qua nội dung của yêu cầu - URL, chuỗi truy vấn, tiêu đề Ngôn ngữ chấp nhận, v.v. Bạn có thể thêm mã để tạo phản hồi có ý nghĩa dựa trên yêu cầu, nhưng sau đó mã sẽ nhận được rất nhiều phức tạp. Bên cạnh đó, các lập trình viên thà tập trung vào viết ứng dụng web, không phải lo lắng về các chi tiết về cách xử lý yêu cầu HTTP.
Một giải pháp phù hợp hơn là sử dụng máy chủ web, chẳng hạn như Apache HTTPD , IIS hoặc nginx . Máy chủ web chỉ là một chương trình lắng nghe các socket TCP có liên quan, chấp nhận nhiều yêu cầu (có thể đồng thời) và quyết định cách tạo phản hồi dựa trên URL yêu cầu, tiêu đề và các quy tắc khác. Lý tưởng nhất, nhiều chi tiết, chẳng hạn như SSL, kiểm soát truy cập và giới hạn tài nguyên được quan tâm thông qua cấu hình thay vì mã. Phần lớn thời gian, máy chủ web sẽ tạo ra một phản hồi chỉ bao gồm nội dung từ các tệp trong hệ thống tệp.
Tuy nhiên, đối với nội dung động, máy chủ web có thể được cấu hình để thực thi một số mã để tạo phản hồi. Một cơ chế để thực hiện điều đó là với CGI - máy chủ đặt một số biến môi trường dựa trên yêu cầu, thực thi chương trình và sao chép đầu ra của nó vào ổ cắm TCP. Một giải pháp phức tạp hơn một chút sẽ là có một mô-đun bổ sung hỗ trợ cho máy chủ web để gọi mã bằng ngôn ngữ lập trình khác (ví dụ mod_php cho Apache ). Tuy nhiên, một tùy chọn khác là viết máy chủ web bằng cùng ngôn ngữ với ứng dụng web, trong trường hợp đó, công văn yêu cầu chỉ là một cuộc gọi chức năng. Đó là trường hợp với các công cụ servlet node.js và Java như Apache Tomcat .
Sự lựa chọn công nghệ thực sự tùy thuộc vào bạn và phụ thuộc vào ngôn ngữ lập trình bạn muốn sử dụng, môi trường lưu trữ có sẵn cho bạn, yêu cầu về hiệu suất, ý kiến phổ biến và thông qua mốt nhất thời. CGI, chẳng hạn, gần đây không được ưa chuộng, vì nhu cầu khởi chạy các chương trình bên ngoài hạn chế khả năng mở rộng.