Gdy przeglądarka wysyła żądanie HTTP, wygląda to tak:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… Na który serwer powinien wysłać odpowiedź, która wygląda następująco:
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>
Wystarczy dowolny kod działający na serwerze, który nasłuchuje żądań na gnieździe TCP, odczyta żądanie i odpowie z odpowiednią odpowiedzią. Jednym głupim sposobem jest po prostu wyrzucenie konserwowanej odpowiedzi każdemu, kto łączy się z portem TCP 80, za pomocą skryptu powłoki:
$ 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
Oczywiście ta technika wydaje się ledwo zgodna z protokołem HTTP .
Krokiem naprzód w stosunku do tej konserwowanej odpowiedzi jest ten prosty program w języku Python, który korzysta z http.server
biblioteki w języku 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()
Serwer HTTP może być napisany w dowolnym języku; to tylko przykład. Oczywiście ten przykład jest bardzo szczątkowy. Ładunek jest zakodowany na stałe - program całkowicie ignoruje treść żądania - adres URL, ciąg zapytania, nagłówek Accept-Language itp. Możesz dodać kod, aby wygenerować znaczące odpowiedzi na podstawie żądania, ale wtedy kod byłby bardzo złożony. Poza tym programiści wolą skupić się na pisaniu aplikacji internetowej, nie martwiąc się o szczegóły obsługi żądania HTTP.
Bardziej odpowiednim rozwiązaniem byłoby użycie serwera WWW, takiego jak Apache HTTPD , IIS lub nginx . Serwer WWW to tylko program, który nasłuchuje na odpowiednich gniazdach TCP, akceptuje wiele żądań (być może jednocześnie) i decyduje, jak wygenerować odpowiedź na podstawie adresu URL żądania, nagłówków i innych reguł. Idealnie, wiele szczegółów, takich jak SSL, kontrola dostępu i limity zasobów, są obsługiwane przez konfigurację, a nie kod. W większości przypadków serwer sieciowy sformułuje odpowiedź, która składa się tylko z zawartości plików w systemie plików.
Jednak w przypadku treści dynamicznych serwer WWW można skonfigurować tak, aby wykonywał pewien kod w celu wygenerowania odpowiedzi. Jednym z mechanizmów tego jest CGI - serwer ustawia niektóre zmienne środowiskowe na podstawie żądania, wykonuje program i kopiuje dane wyjściowe do gniazda TCP. Nieco bardziej wyrafinowanym rozwiązaniem byłoby posiadanie modułu, który dodaje obsługę serwera WWW do wywoływania kodu w innym języku programowania (np. Mod_php dla Apache ). Jeszcze inną opcją jest napisanie serwera WWW w tym samym języku co aplikacja internetowa, w którym to przypadku wysłanie żądania jest tylko wywołaniem funkcji. Tak jest w przypadku węzłów.js i silników serwletów Java, takich jak Apache Tomcat .
Wybór technologii zależy wyłącznie od Ciebie i zależy od preferowanego języka programowania, dostępnego środowiska hostingowego, wymagań dotyczących wydajności, popularnych opinii i pozytywnych trendów. Na przykład CGI nie było ostatnio preferowane, ponieważ potrzeba uruchamiania programów zewnętrznych ogranicza skalowalność.