Front-End: HTTP Parte 2
Published: 2022-02-17 14:19:32

**HTTP Parte 2:**

**Visão Geral:** O **<u>HTTP</u>** é um protocolo de buscas para documentos **<u>HTML</u>**. O **<u>HTTP</u>** serve como base de dados para qualquer troca web como cliente-servidor, de forma a indicar que o destinatário iniciou a solicitação a partir de um navegador. Um documento só se torna completo quando obtem subdocumentos como textos, descrições, imagens, etc.

Clientes se comunicam com servidores por meio de mensagens. As mensagens são chamadas de requisições e repostas, requisições para o cliente e respostas para o servidor.

O **<u>HTTP</u>** teve inicio na década de 90 como um procolo de extensão. Esse protocolo é enviado por uma conexão criptografada chamada **<u>TCP</u>** através do **<u>TLS</u>** (mas, qualquer protocolo de transporte pode ser usado, **<u>TLS</u>** e **<u>TCP</u>** são os mais comuns de uso). Sua capacibilidade de se estender (extensabilidade), torna o **<u>HTTP</u>** capaz de buscar hipertextos ou videos além de poder postar estes conteúdos nos servidores, essas ações só se tornam possiveis através dos formulários **<u>HTML</u>**, além é claro, o **<u>HTTP</u>** pode atualizar páginas da web buscando sob demanda seus documentos.

> ⦁	**_Componentes baseados em HTTP:_** O **<u>HTTP</u>** é baseado no protocolo cliente-servidor, onde o agente-usuário (o "**usuário**" é um navegador da própria web) na maioria das vezes envia solicitações ao servidor, essas solicitações podem ser qualquer coisa, desde um formaulario até um rastreador para manter o índice de mecanismo de pesquisa.

> As solicitações são individuais, e quando mandadas a um servidor recebem uma response "**a resposta possui esse nome**". Entre o cliente e o servidor existem os "**proxies**", que são entidades que realizam operações de "**caches**" ou gateways.

> Entre o navegador e o servidor, existem muitos roteadores, modens, redes, etc. O design das camadas da web ficam ocultos e se encontram nas camadas de rede e transporte, o **<u>HTTP</u>** se encontra na camada de aplicação, no topo. As camadas subjacentes são irrelevantes apesar de serem as responsaveis por diagnosticar problemas de rede.

> ⦁	**_Cliente:_** O **Agente do Usuário**, é uma ferramenta que executa o navegador em nome do usuário, mas também pode ser usado para excutar programas e depurar aplicativos por engenheiros e Devs.

> O navegador sempre será o responsavel por iniciar uma solicitação.

> O navegador envia uma solicitação para buscar um documento HTML original para exibir e representar uma página web, a proxima etapa é analisar os arquivos e fazer as solicitações dos scripts de execução adicionais, seguindo com o **<u>CSS</u>** (informações de layout) contido na página (as imagens e vídeos) que é exibido junto dos sub-recursos. O navegador web combina os recursos e os apresenta completos com os documentos da página.

> As páginas web são links que podem ser ativados, isso faz com que eles sejam documentos de hipertexto, que buscam novas páginas para permitir que o usuário direcione o agente para o navegador. Por sua vez, o navegador faz a tradução das eintruções e interpreta o **<u>HTTP</u>** para garantir uma resposta clara para o usuário.

> ⦁	**_Servidor:_** No oposto, se encontra o **Servidor**, uma ou mais máquinas virtuais que compartilham cargas, o servidor **atende** as solicitações do cliente. Também é descrito como um software complexo que gera documentos completos ou parciais através  de demanda enquanto interroga outros computadores.

> O **Servidor** é composto de vários softwares em uma máquina com **<u>HTTP/1.1</u>** e um **host** que compartilhar o mesmo endereço **<u>IP</u>**.

> ⦁	**_Proxies:_** Entre o navegador e o servidor existem varias máquinas, vários computadores que fazem a retransmissão das mensagens **<u>HTTP</u>**, e em sua maioria operam através do transporte fisico ou por rede. Esse fator, tornam as mensagens transparentes impactando o desempenho, nas camadas de aplicação, os servidores que opram lá são chamados de **Proxies**. Eles transportam e encaminham pedidos sem alteração (não são transparentes) para enviar ao servidor.

> Funções:

> 1.	**_Cache:_** Pode ser publico ou privado.

> 2.	**_Filtragem:_** Verificação antivírus e controle parental.

> 3.	**_Balanceamento de carga:_** Permite que um servidor atenda diversas solicitações.

> 4.	**_Autenticação:_** Controla o acesso a diferentes recursos.

> 5.	**_Logging:_** Permite que informações históricas sejam armazenadas.

**Aspectos básicos:**

> ⦁	**_HTTP Simples:_** O **<u>HTTP</u>** foi projetado para ser legível pelos e simples, apesar de que a versão **<u>HTTP/2</u>** foi introduzida uma certa complexidade de encapsulamento de mensagens **<u>HTTP</u>** em quadros. As mensagens ainda podem ser lidas e compreendidas, o que facilita e propõe aos **Devs** antigos e os novos mais testes com uma grande redução na complexidade.
 
> ⦁	**_HTTP Extensivel:_** A extensibilidade foi implementada na versão **HTTP/1.0** onde os cabeçalhos ganharam o protocolo de estender as funcionalidades e experimentar novas. Isso é feito por um acordo entre o cliente e o servidor para a semântica do cabeçalho.

> ⦁	**_HTTP Sem estado mas com Sessão:_** Não existem links que se concluem em uma unica sessão **<u>HTTP</u>**, os cookies realizam a permissão de estados nas sessões. A partir da esxtensão do cabeçalho os cookies permitem na criação de cada sessão de solicitação o fluxo de trabalho, que compartilha do mesmo contexto que o estado.

> ⦁	**_Conexões HTTP:_** Uma conexão vem da camada de transporte, de fora do escopo **<u>HTTP</u>**, não precisa de um protocolo baseado em conexão, somente que seja confiável, sem perda de mensagens. O **<u>TCP</u>** e o **<u>UDP</u>** são os protocolos de transporte mais comuns da internet, porém o **<u>TCP</u>** é confiavel e o **<u>UDP</u>** não.

> ⦁	**_Controle HTTP:_** A propria natureza de extensibilidade do **<u>HTTP</u>** permite que as funcionalidades da web possam ser controlados através de autenticação de caches, conseguindo assim a capacidade de retirar a **restrição de origem**. Infelizmente, essa capacidade de controle só pode ser inserida no **<u>HTTP</u>** em 2010.

**Recursos controláveis:**

> ⦁	**_Cache:_** O servidor instrui que os proxies e os clientes para que armazenem um determinado tipo de conteúdo em um cache normal ou um intermediario (que pode ignorar documentos).

> ⦁	**_Restrição de Origem:_** Essa funcionalidade, é usada para garantir que aja privacidade, evitando espionagens e invasões somente páginas de mesma origem tem acesso as informações.

> ⦁	**_Autenticação:_** Para que somente um tipo de usuário acesse uma determinada página, o **<u>HTTP</u>** utiliza o **www-Authenticate** ou os **cookies**.

> ⦁	**_Servidores e Clientes Proxy de Encapsulamento:_** Estão localizados na **intranet** ocultando seu **IP**, passando barreiras de rede através de proxies.

> ⦁	**_Sessões:_** São criadas a partir de solicitações com o servidor.

**Mensagens HTTP:**

> ⦁	**_Método:_** O **Método** pode ser um verbo "**GET** ou **POST**" ou um substantivo "**OPTIONS** ou **HEAD**" feito para realizar a operação do cliente. O cliente busca um recurso **GET** ou fazer um **POST** de um formulário ou valor.

> ⦁	**_Caminho do Recurso:_** A **<u>URL</u>** possui diversos elementos, alguns deles são: **Protocolo** (**HTTP://**), o **domínio** ou **porta** (**developer.mozilla.org**) e o **<u>TCP</u>** (**80**).

> ⦁	**_Versão do Protocolo_**

> ⦁	**_Cabeçalhos:_** São informações adicionais para o servidor.

> ⦁	**_Corpo:_** O **Corpo** contêm os recursos enviados do **Método**, sendo eles **GET** ou **POST**.

**Respostas:** 

**Consistem nos seguintes elementos:**

> ⦁	**_Versão do Protocolo HTTP_**

> ⦁	**_Código de Status_**

> ⦁	**_Mensagem do Status_**

> ⦁	**_Cabeçalhos_**

> ⦁	**_Corpo_**

**APIs baseados em HTTP:** A **<u>API</u>** mais usado em **<u>HTTP</u>** é a **XMLHttpRequest**, que é utilizada para trocar dados entre o usuário e o servidor. O **<u>Fetch API</u>** é mais flexível, poderoso e moderno, fornecendo uma versão melhorada dos recursos já utilizados.

A **server-sent-events**, é outra **API** com serviço unidirecional que fornece o envio de eventos do servidor para o cliente. O **EventSource** é uma interface que fornece manipuladores de eventos que convertem automaticamente as mensagens que chegam ao **Event** do fluxo **<u>HTTP</u>**, o **type** e o **onmessage** são manipuladores de eventos que são utilizados caso não aja um outro especifico sendo utilizado.

**Base:** Artigo escrito com base no texto da MDN Web Docs

**Motivos:** 

> **1.**	Artigo escrito com intuito de aprendizado, todos os creditos vão para a MDN Web Docs por incentivar o aprendizado. 

> **2.**	Fiz totalmente como forma de estudo.

**Referência:** https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview

**Autor:** Moisés Rodrigues Martins