Quando um navegador faz uma solicitação HTTP, fica assim:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… Para o qual o servidor deve enviar uma resposta parecida com esta:
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>
Qualquer código em execução no servidor que escute solicitações em um soquete TCP, leia a solicitação e responda com a resposta apropriada será suficiente. Uma maneira idiota é apenas cuspir uma resposta enlatada para quem se conecta à porta TCP 80, usando um script de 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
Obviamente, essa técnica mal parece estar em conformidade com o protocolo HTTP .
Um passo adiante dessa resposta em lata é esse simples programa Python, que usa a http.server
biblioteca no 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()
O servidor HTTP pode ser escrito em qualquer idioma; isso é apenas um exemplo. Obviamente, este exemplo é muito rudimentar. A carga útil é codificada - o programa desconsidera completamente o conteúdo da solicitação - a URL, a string de consulta, o cabeçalho Accept-Language etc. Você pode adicionar código para gerar respostas significativas com base na solicitação, mas o código ficará muito complexo. Além disso, os programadores preferem se concentrar em escrever o aplicativo da Web, sem ter que se preocupar com os detalhes de como lidar com uma solicitação HTTP.
Uma solução mais apropriada seria usar um servidor da Web, como Apache HTTPD , IIS ou nginx . Um servidor da web é apenas um programa que escuta nos soquetes TCP relevantes, aceita várias solicitações (possivelmente simultaneamente) e decide como gerar uma resposta com base na URL da solicitação, nos cabeçalhos e em outras regras. Idealmente, muitos dos detalhes, como SSL, controle de acesso e limites de recursos, são resolvidos via configuração, e não por código. Na maioria das vezes, o servidor da Web formulará uma resposta que consiste apenas no conteúdo dos arquivos no sistema de arquivos.
No entanto, para conteúdo dinâmico, o servidor da web pode ser configurado para executar algum código para gerar a resposta. Um mecanismo para fazer isso é com CGI - o servidor define algumas variáveis de ambiente com base na solicitação, executa um programa e copia sua saída no soquete TCP. Uma solução um pouco mais sofisticada seria ter um módulo que adiciona suporte ao servidor da Web para chamar código em outra linguagem de programação (por exemplo, mod_php para Apache ). Ainda outra opção é escrever o servidor da web no mesmo idioma que o aplicativo da web; nesse caso, o despacho da solicitação é apenas uma chamada de função. É o caso dos mecanismos de servlet node.js e Java, como o Apache Tomcat .
A escolha da tecnologia depende de você e depende da linguagem de programação que você preferir usar, do ambiente de hospedagem disponível, requisitos de desempenho, opinião popular e modismos passageiros. O CGI, por exemplo, não tem sido favorecido ultimamente, uma vez que a necessidade de iniciar programas externos limita a escalabilidade.