Когда браузер делает 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-Language и т. Д. Вы можете добавить код для генерации значимых ответов на основе запроса, но тогда код получится очень сложный. Кроме того, программисты скорее сосредоточатся на написании веб-приложения, не беспокоясь о деталях обработки HTTP-запроса.
Более подходящим решением будет использование веб-сервера, такого как Apache HTTPD , IIS или nginx . Веб-сервер - это просто программа, которая прослушивает соответствующие сокеты TCP, принимает несколько запросов (возможно, одновременно) и решает, как сгенерировать ответ, основываясь на URL-адресе запроса, заголовках и других правилах. В идеале многие детали, такие как SSL, контроль доступа и ограничения ресурсов, учитываются с помощью конфигурации, а не кода. В большинстве случаев веб-сервер формулирует ответ, который состоит только из содержимого файлов в файловой системе.
Однако для динамического содержимого веб-сервер может быть настроен на выполнение некоторого кода для генерации ответа. Один из механизмов для этого - CGI - сервер устанавливает некоторые переменные окружения на основе запроса, выполняет программу и копирует свои выходные данные в сокет TCP. Несколько более сложным решением было бы иметь модуль, который добавляет поддержку веб-сервера для вызова кода на другом языке программирования (например, mod_php для Apache ). Еще один вариант - написать веб-сервер на том же языке, что и веб-приложение, и в этом случае отправка запроса - это просто вызов функции. Это имеет место в случае с node.js и механизмами Java-сервлетов, такими как Apache Tomcat .
Выбор технологии действительно зависит от вас и зависит от языка программирования, который вы предпочитаете использовать, среды хостинга, которая вам доступна, требований к производительности, популярного мнения и преходящих увлечений. Например, CGI в последнее время не пользуется популярностью, поскольку необходимость запуска внешних программ ограничивает масштабируемость.