Bir tarayıcı bir HTTP isteği yaptığında, şöyle görünür:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… Sunucunun buna benzeyen bir yanıt göndermesi gerekir:
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>
Bir TCP soketindeki istekleri dinleyen, sunucuda çalışan herhangi bir kod, isteği okur ve uygun yanıtla yanıtlar yeterli olacaktır. Aptalca bir yol, yalnızca bir kabuk betiği kullanarak TCP bağlantı noktası 80'e bağlanan herkese karşı verilen yanıtı dağıtmaktır:
$ 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
Tabii ki, bu teknik ancak ancak HTTP protokolüne uygun görünmektedir .
Bu hazır yanıttan bir adım daha http.server
Python 3'deki kütüphaneyi kullanan bu basit Python programı var .
#!/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 sunucusu herhangi bir dilde yazılabilir; bu sadece bir örnek. Açıkçası, bu örnek çok basit. Yükü kodlanmış - program isteğin içeriğini tamamen göz ardı ediyor - URL, sorgu dizesi, Kabul Dilini, vb., İsteği temel alarak anlamlı yanıtlar üretmek için kod ekleyebilirsiniz, ancak daha sonra kod çok kompleksi. Ayrıca, programcılar bir HTTP isteğinin nasıl ele alınacağı hakkında endişelenmenize gerek kalmadan web uygulamasını yazmaya odaklanırlar.
Daha uygun bir çözüm, Apache HTTPD , IIS veya nginx gibi bir web sunucusu kullanmak olacaktır . Bir web sunucusu sadece ilgili TCP soketlerini dinleyen, çoklu istekleri (muhtemelen aynı anda) kabul eden ve istek URL'sine, başlıklarına ve diğer kurallara dayanarak nasıl cevap verileceğine karar veren bir programdır. İdeal olarak, SSL, erişim kontrolü ve kaynak sınırları gibi ayrıntıların çoğu kod yerine yapılandırma yoluyla halledilir. Çoğu zaman, web sunucusu, dosya sistemindeki dosyalardan yalnızca içerikten oluşan bir yanıt oluşturacaktır.
Bununla birlikte, dinamik içerik için web sunucusu, yanıtı oluşturmak üzere bir kod yürütecek şekilde yapılandırılabilir. Bunu yapmak için bir mekanizma CGI ile - sunucu isteği temel alarak bazı ortam değişkenleri belirler, bir program yürütür ve çıktısını TCP soketine kopyalar. Biraz daha karmaşık bir çözüm, başka bir programlama dilinde kod çağırmak için web sunucusuna destek ekleyen bir modüle sahip olmak olacaktır (örn . Apache için mod_php ). Diğer bir seçenek de web sunucusunu web uygulaması ile aynı dilde yazmaktır; bu durumda istek gönderimi sadece bir işlev çağrısıdır. Bu, node.js ve Apache Tomcat gibi Java sunucu uygulaması motorları için geçerlidir .
Teknolojinin seçimi gerçekten size bağlıdır ve kullanmayı tercih ettiğiniz programlama diline, kullanabileceğiniz barındırma ortamına, performans gereksinimlerine, popüler düşüncelere ve geçici sorunlara bağlıdır. Örneğin, CGI son zamanlarda tercih edilmedi, çünkü harici programları başlatma ihtiyacı ölçeklenebilirliği sınırlıyor.