Saat browser membuat permintaan HTTP, tampilannya seperti ini:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
... di mana server harus mengirim respons yang terlihat seperti ini:
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>
Setiap kode yang berjalan pada server yang mendengarkan untuk permintaan pada soket TCP, membaca permintaan, dan balasan dengan respon yang tepat akan cukup. Salah satu cara bodoh adalah dengan mengeluarkan respons kalengan kepada siapa pun yang terhubung ke TCP port 80, menggunakan skrip 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
Tentu saja, teknik itu nyaris tidak sesuai dengan protokol HTTP .
Sebuah langkah maju dari respons kalengan adalah program Python sederhana ini, yang menggunakan http.server
pustaka dalam 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()
Server HTTP dapat ditulis dalam bahasa apa pun; itu hanya sebuah contoh. Jelas, contoh ini sangat sederhana. Payloadnya dikodekan secara keras - program sepenuhnya mengabaikan isi permintaan - URL, string kueri, tajuk Bahasa Terima, dll. Anda dapat menambahkan kode untuk menghasilkan respons yang bermakna berdasarkan permintaan, tetapi kemudian kode akan menjadi sangat kompleks. Selain itu, programmer lebih suka fokus menulis aplikasi web, tidak perlu khawatir tentang detail bagaimana menangani permintaan HTTP.
Solusi yang lebih tepat adalah dengan menggunakan server web, seperti Apache HTTPD , IIS , atau nginx . Server web hanyalah sebuah program yang mendengarkan pada soket TCP yang relevan, menerima beberapa permintaan (mungkin secara bersamaan), dan memutuskan bagaimana menghasilkan respons berdasarkan URL permintaan, tajuk, dan aturan lainnya. Idealnya, banyak detail, seperti SSL, kontrol akses, dan batasan sumber daya dijaga melalui konfigurasi alih-alih kode. Sebagian besar waktu, server web akan merumuskan respons yang hanya terdiri dari konten dari file dalam sistem file.
Untuk konten dinamis, server web dapat dikonfigurasi untuk mengeksekusi beberapa kode untuk menghasilkan respons. Salah satu mekanisme untuk melakukan itu adalah dengan CGI - server menetapkan beberapa variabel lingkungan berdasarkan permintaan, menjalankan program, dan menyalin hasilnya ke soket TCP. Solusi yang sedikit lebih canggih adalah dengan memiliki modul yang menambahkan dukungan ke server web untuk memanggil kode dalam bahasa pemrograman lain (mis. Mod_php for Apache ). Namun pilihan lain adalah untuk menulis server web dalam bahasa yang sama dengan aplikasi web, dalam hal ini pengiriman permintaan hanyalah panggilan fungsi. Itu adalah kasus dengan node.js dan mesin servlet Java seperti Apache Tomcat .
Pilihan teknologi benar-benar terserah Anda, dan tergantung pada bahasa pemrograman yang Anda inginkan, lingkungan hosting yang tersedia untuk Anda, persyaratan kinerja, pendapat populer, dan mode yang lewat. CGI, misalnya, belum disukai akhir-akhir ini, karena kebutuhan untuk meluncurkan program eksternal membatasi skalabilitas.