Aplicações Web – Parte 02 – Requisições Web e o protocolo HTTP

Na web, todas as operações e visualizações de páginas são baseadas em requisições. Uma requisição nada mais é do que uma solicitação de determinado conteúdo / recurso ao servidor. Se trata-se de um recurso estático, um arquivo de imagem que está armazenado no sistema de arquivos do servidor, por exemplo, é solicitado ao servidor um acesso de leitura (GET) este arquivo. Se preenchemos um formulário Web de cadastro, por exemplo, os dados do formulários são consolidados e convertidos em uma sequência de caracteres e enviados ao servidor através de uma requisição de envio (POST) para um programa ou script, que por sua vez, sendo executado no servidor, processa os dados enviados e registra o cadastro. Existem outros métodos HTTP além do GET e do POST, e vamos falar um pouco deles.

Métodos HTTP

De acordo com o RFC2616, mais especificamente a partir de sua página 51, descreve e detealha os métodos / verbos HTTP:

OPTIONS
Solicita informações sobre as opções disponíveis no servidor para o recurso especificado.
GET
Solicita a informação representada pelo recurso especificado.
HEAD
Solicita apenas o cabeçalho da ainformação representada pelo recurso especificado. Deve ser idêntica ao GET, porém não deve retornar conteúdo na mensagem, apenas seus cabeçalhos.
POST
Envia dados para um script ou processo. No REST, é mais comumente é utilizada para criação de novos objetos em um recurso.
PUT
Envia dados para que sejam o conteúdo da entidade representada pelo endereço da requisição. A diferença essencial entre o POST e o PUT é no significado no endereço da requisição. No POST, é um script / processador / controller, e no PUT, é o caminho de um objeto de fato.
DELETE
Solicita ao servidor que apague o recurso representado pelo endereço da requisição.
TRACE
Solicita ao servidor que devolva toda a requisição de volta (loopback) para fins de depuração.
CONNECT
Connecta-se a outro endereço, realizando um túnel (Proxy HTTP).

Processamento da Requisição

Como já vimos no artigo anterior, uma requisição pode ser processada de forma estática, diretamente pelo servidor web, ou pode ser dinamicamente processada por um programa ou script, a fim de que haja alguma lógica dinâmica, que retorna ao cliente um resultado diferente, dependendo de fatores como parâmetros enviados na requisição, bem como o tempo e estado corrente do sistema.

Para fins didáticos, adotaremos a linguagem PHP nos exemplos dos artigos desta série, em geral, podendo haver exemplos em outra linguagem, caso seja necessário mostrar um caso específico de uso em outra linguagem.

Requisições de Recursos Estáticos

As requisições de recursos estáticos são bem simples. Para leitura, no endereço da requisição, é enviado o caminho do arquivo, relativo à raiz da pasta pública do servidor web, considerando possíveis atalhos (aliases) e diretórios virtuais (virtual dir) nele configurados. Quando o servidor Web recebe a requisição de leitura, ele busca pelo arquivo solicitado no endereço da requisição e, caso exista e esteja acessível, devolve o seu conteúdo, STATUS CODE 200 (OK) e cabeçalho de tipo de conteúdo (Content-Type), dentre outros cabeçalhos, que dependem do servidor web. Caso não exista, o servidor devolve o STATUS CODE 404, indicando que o recurso não foi encontrado. Ainda é possível que o recurso exista mas não esteja acessível por critérios de segurança e permissionamento (STATUS CODE 403 e variantes). Detalharemos melhor esse tipo de situação quando estivermos falando de Autenticação Web no próximo artigo. Para escrita, se habilitado, o servidor pode receber arquivos em requisições PUT, por exemplo, e criar / sobrescrever arquivos.

Requisições de Recursos Dinâmicos

As requisições de recursos dinâmicos não podem ser simplesmente explicadas em um parágrafo como as estáticas. Essas requisições que realmente tornam possível a criação de aplicações web, pois elas funcionam como chamadas a programas, e é o que de fato são. Um exemplo de requisição de leitura é o acesso às informações de um produto em uma loja virtual. Para isso, o navegador monta uma requisição GET ao endereço solicitado pelo usuário, que é na verdade, o script product.php, passando como parâmetro o número identificador (ID) do produto, a fim de referenciá-lo para recuperar a ficha:

GET /product.php?id=12346
O resultado dessa requisição então é um código HTML que, ao ser processado pelo navegador, exibe visualmente os dados do produto, incluindo links, imagens, e mais informações, tudo o que os donos e desenvolvedores da loja virtual julgaram relevante para que seus clientes visualizem e comprem.

O arquivo product.php, na raiz do servidor web, contém um script de processamento, nesse caso escrito em PHP, que baseado no parâmetro id enviado, busca o produto na base de dados, e o exibe. Vamos demonstrar uma versão bem simples abaixo:


Produto:

Preço:

Descrição:
Clique aqui para comprar

Quando a requisição é enviada para o servidor web, este localiza o script baseado no endereço, e o executa com os parâmetros de requisição, inclusive a própria requisição (e é dessa forma que um script pode entender que recebeu uma requisição vinda de uma determinada localização / cidade, e exibir algo relacionado, ou até mesmo registrar o IP do cliente, por segurança das transações).

O script, no início, guarda na variável $id o ID do produto, e então chama uma função implementada na biblioteca, chamada fn_busca_produto_por_id, que faz o que for a fim de recuperar os dados do produto em uma base de dados e converter em um objeto, que possa ser utilizado no código posteriormente. Então, em seguida, imprime o HTML, com título, informações do produto e um link para compra. Simples assim. Dessa forma poderia ser também o acesso a um portal do clima, que busca as informações climáticas em uma base de dados constantemente atualizada por sensores, etc.

No próximo artigo, falaremos sobre autenticação em requisições e aplicações web.

Obrigado e até a próxima!

Pedro Ferreira

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *