Pular para o conteúdo
murad.guide

Referência Essencial da Web

Capítulo 26

Primeiros passos no servidor

3 min de leitura 579 palavras 1 gravura

Trabalhe numa cópia da pasta inicio/ desta etapa. Ela já abre ou executa com as instruções do README. Leia o código, mude uma coisa e anote sua previsão antes de recarregar. Compare com a referência na pasta da etapa. Se nada mudar, confira a extensão do arquivo, o arquivo salvo e o caminho aberto. Blocos adicionais do capítulo são experiências separadas; a pasta de referência contém o programa completo desta etapa.

A Biblioteca da Ribeira, acervo comunitário fictício no bairro da Ribeira, Recife, até agora era arquivo estático. Um processo na sua máquina passa a escutar pedidos e responder. PHP não entra neste volume.

O exemplo está em exemplos/26-primeiros-passos-no-servidor/. O ciclo: ler, copiar, mudar uma coisa, prever, recarregar, conferir.

O que você vai aprender

Cliente e servidor

O cliente é o navegador. Ele pede. O servidor é o programa que escuta e devolve HTML, CSS, JSON ou erro.

Pedido HTTP de um lado e resposta do outro

Pedido típico: GET / ou GET /livros. Resposta típica: código 200 e um arquivo. Se o caminho não existe, 404. O navegador então pinta o HTML. O servidor já terminou aquele pedido.

Frameworks, o mapa

Um framework de servidor organiza rotas, modelos e páginas. Neste volume virão Django (Python) e Express (Node). O capítulo 27 abre Django. Express espera a 30.

Página estática é arquivo pronto, como este index.html. Página gerada nasce na hora, a partir de modelo e dados. servidor.py ainda só entrega o arquivo.

Você não escolhe um framework agora. Primeiro vê um processo mínimo em Python, só nesta máquina. PHP não entra em nenhuma destas pastas.

Segurança básica

Não confie no que o cliente envia. Qualquer um pode editar HTML e JS na própria janela. Validação no navegador ajuda a pessoa. A decisão de verdade, quando houver servidor de dados, fica no servidor.

Não publique exercício com dado real. Não escute em 0.0.0.0. Estudo: 127.0.0.1. Senha, sessão e HTTPS entram nos capítulos de Django e Express. Aqui o servidor só entrega arquivo estático.

python servidor.py

from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler

class Handler(SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        print("pedido", args[0])

if __name__ == "__main__":
    server = ThreadingHTTPServer(("127.0.0.1", 8768), Handler)
    print("http://127.0.0.1:8768")
    server.serve_forever()

Na pasta do exemplo:

python servidor.py

Abra http://127.0.0.1:8768. O terminal imprime o pedido. Encerre com Ctrl+C.

<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Servidor local</title>
  </head>
  <body>
    <h1>Este arquivo é estático</h1>
    <p>Rode <code>python servidor.py</code> nesta pasta. O processo escuta só 127.0.0.1:8768.</p>
  </body>
</html>

Mude o <h1> para “Pátio da Ribeira”. Salve. Preveja o novo título. Recarregue http://127.0.0.1:8768. Confira. O processo continua o mesmo; o arquivo no disco é que mudou.

Erro comum: abrir index.html pelo disco e achar que servidor.py está rodando. Sem o processo, a porta 8768 não responde. Outro erro: copiar um tutorial com 0.0.0.0.

Disco guarda servidor.py e index.html. A janela em 127.0.0.1:8768 é o teste. Publicação pública não é este passo. PHP não faz parte deste percurso.

Atividades

  1. Quem é o cliente e quem é o servidor neste exemplo?
  2. Por que o endereço é 127.0.0.1 e não 0.0.0.0?
  3. Validar um formulário só no navegador basta quando o servidor guardar dado?

Respostas comentadas

  1. Cliente: o navegador que pede http://127.0.0.1:8768. Servidor: o processo python servidor.py que escuta a porta 8768 e devolve index.html.
  2. 127.0.0.1 é só esta máquina. 0.0.0.0 abre a escuta para outros endereços. O volume não usa isso.
  3. Não. O cliente pode ser alterado. Quando houver dado de verdade, o servidor também valida. Neste capítulo ainda não há banco.

O arquivo completo

Referência do exemplo 26-primeiros-passos-no-servidor, reproduzida aqui para que você possa conferir sem sair da página.

index.html

<!DOCTYPE html>

<html lang="pt-BR">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>Servidor local</title>
<style>
/* Apoio de leitura, teclado e tela estreita. */
img{max-width:100%;height:auto} html {overflow-wrap:anywhere} main {min-width:0} input,textarea,select,canvas {max-width:100%;box-sizing:border-box} fieldset {min-width:0}
pre {max-width:100%;overflow:auto} :focus-visible {outline:3px solid #0f3d3e;outline-offset:3px}
.skip {position:absolute;top:-5rem;left:1rem;background:#0f3d3e;color:white;padding:.5rem;z-index:9}.skip:focus {top:.5rem}
table {max-width:100%} td,th {overflow-wrap:anywhere}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
</style></head>
<body><a class="skip" href="#conteudo">Pular para o conteúdo</a><main id="conteudo" tabindex="-1">
<h1>Este arquivo é estático</h1>
<p>Rode <code>python servidor.py</code> nesta pasta. O processo escuta só 127.0.0.1:8768.</p>
</main></body>
</html>

servidor.py

from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler

class Handler(SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        print("pedido", args[0])

if __name__ == "__main__":
    server = ThreadingHTTPServer(("127.0.0.1", 8768), Handler)
    print("http://127.0.0.1:8768")
    server.serve_forever()