Коли браузер робить HTTP-запит, це виглядає приблизно так:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… На який сервер повинен надіслати відповідь, яка виглядає приблизно так:
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>
Будь-який код, запущений на сервері, який прослуховує запити на TCP-сокеті, читає запит і відповідає з відповідною відповіддю, буде достатньо. Один з найглухіших способів - просто виплюнути консервовану відповідь будь-кому, хто підключається до порту TCP 80, використовуючи сценарій оболонки:
$ 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
Звичайно, ця методика ледве відповідає протоколу HTTP .
Крок від цієї консервованої відповіді - це проста програма Python, яка використовує http.server
бібліотеку в 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()
Сервер HTTP може бути написаний будь-якою мовою; це лише приклад. Очевидно, що цей приклад дуже рудиментарний. Корисне навантаження важко кодується - програма повністю ігнорує вміст запиту - URL-адресу, рядок запиту, заголовок Accept-мови тощо. Ви можете додати код для створення значущих відповідей на основі запиту, але тоді код отримає дуже складний. Крім того, програмісти скоріше зосереджуються на написанні веб-програми, не турбуючись про деталі, як обробляти HTTP-запит.
Більш підходящим рішенням буде використання веб-сервера, такого як Apache HTTPD , IIS або nginx . Веб-сервер - це лише програма, яка прослуховує відповідні сокети TCP, приймає кілька запитів (можливо, одночасно) і вирішує, як генерувати відповідь на основі URL-адреси запиту, заголовків та інших правил. В ідеалі багато деталей, таких як SSL, контроль доступу та обмеження ресурсів, забезпечуються за допомогою конфігурації, а не коду. Значну частину часу веб-сервер формулює відповідь, що складається лише з вмісту з файлів у файловій системі.
Однак для динамічного вмісту веб-сервер може бути налаштований на виконання деякого коду для створення відповіді. Один з механізмів для цього є з CGI - сервер встановлює деякі змінні середовища на основі запиту, виконує програму та копіює свій вихід у сокет TCP. Трохи складнішим рішенням буде мати модуль, який додає підтримку веб-серверу для виклику коду іншою мовою програмування (наприклад, mod_php для Apache ). Ще один варіант - написати веб-сервер тією ж мовою, що й веб-додаток, і в такому випадку відправка запиту - це лише виклик функції. Це стосується двигунів node.js та сервлетів Java, таких як Apache Tomcat .
Вибір технології дійсно залежить від вас і залежить від мови програмування, яку ви бажаєте використовувати, хостинг-середовища, яке вам доступне, вимог до продуктивності, популярної думки та прихильності. Наприклад, CGI останнім часом не надається переваги, оскільки необхідність запуску зовнішніх програм обмежує масштабованість.