HTTP: Entendendo a web por baixo dos panos
O HTTP é independente de qualquer plataforma de desenvolvimento, de qualquer linguagem. A primeira coisa que vem a mente quando falamos de HTTP é utilização da internet por navegadores.
O modelo de envio de dados é o cliente-servidor, baseado em regras, que na web é chamado de protocolos. O protocolo do HTTP já está na versão 2, mas ainda é muito utilizada a versão 1.1.
Tópicos:
- HTTPS - a web segura
- ENDEREÇOS
- PORTAS
- RECURSOS
- MODELO REQUISIÇÃO RESPOSTA
- MÉTODOS
- SERVIÇOS REST
- VERSÃO 2 HTTP
HTTPS - A web segura
Quando trabalhamos com modelo de requisição, o nosso navegador pode enviar dados.
Ao entrar no site da alura, na parte de login, quando colocamos nosso usuário e senha, recebemos uma mensagem de sucesso ou falha no login. Isso acontece porque o servidor verificou a requisição e analisou se iria valida-lo ou não o acesso.
Olhando pela aba de inspeção do navegador, na parte network é possível ver os dados enviados na requisição do login. Esse dados são enviados até o servidor, mas até chegar lá ele passa por muitos intermediários como routeador, modem, provedor e etc. Isso não é seguro, pois qualquer um mal intencionado pode intervir na comunicação e olhar os dados trafegados, image fazer isso num internet banking.
Devido a isso foi criado o HTTP + SSL/TLS = HTTPS
HTTP (Hypertext Transfer Protocol )
SSL (Secure Sockets Layer)
TLS (Transport Layer Security)
Os navegadores exibem na URL os sites com protocolo HTTPS.
Para deixar o site mais seguro é necessário um certificado digital. Onde do lado no navegador fica uma chave pública e do lado do servidor uma chave privada, em que só ela conhece.
O navegador usa a chave para encriptografar os dados e envia-los até o servidor, e o servidor faz o processo inverso com a sua chave.
Endereços
Os endereços são informações que indicam onde os navegadores devem solicitar conexão para uma futura troca de dados com ele.
Exemplo:
HTTP://ALURA.COM.BR
HTTP - É o protocolo de comunicação
ALURA - É o domínio do site
COM.BR - É a especificação do domínio, que nos passam mais informações sobre o endereço, podendo ser:
- COM - Comercial
- BR - Site hospedado no Brasil
- ORG - Um site organizacional
- e etc.
Os domínio nada mais é do que um nome fácil de memorizar, pois na comunicação web o navegador busca no servidor DNS o nome e o converte em endereço de IP.
O DNS é parecido com um banco de dados, onde ele armazena os domínios e os IP's relacionados.
Portas
O domínio pode ser ainda mais específico passando o número da porta a ser acessada, mas essa porta tem que estar aberta a requisições de fora.
Na web a porta padrão é a 80, por isso não precisamos digita-la sempre que escrevemos o nome de uma URL.
No protocolo HTTPS essa porta é alterada para a 443, mas ela fica configurada como padrão também.
Recursos
Em uma URL também é possível passar mais informações para indicar o local onde estamos buscando aquelas informações, isso é chamado de recurso. O recurso é algo concreto que queremos acessar.
Exemplo:
https://alura.com.br:443/course/introducao-html-css
- https - indica que estamos na web com um protocolo criptografado;
- alura - É o domínio, que será convertido em número de IP pelo DNS;
- com - Indica que o site é comercial;
- br - Indica que o site está hospedado no Brasil;
- 443 - É a porta que estamos acessando, como ela é a padrão não é obrigatório colocarmos;
- course/introducao-html-css - É o recurso que estamos passando ao servidor, dizendo qual informação queremos.
Modelo requisição e resposta
O protocolo HTTPS é stateless, ele não guarda informações entre requisições, ou seja toda requisição que é enviada não é guardada no servidor ou navegador.
Sendo assim toda vez que procuramos por um curso na Alura estamos enviando o login e senha pro servidor ?
Não é necessário, pois o servidor quando envia a página de resposta dos cursos ele também passa um código, assim toda as vezes que procurarmos um novo curso é só passarmos aquele código que o servidor já saberá quem está logado.
Esse conceito é chamado de SESSÃO, que é a guardar a informação daquele usuário até que ele não necessite mais e encerre a sessão. Essa implementação só ocorre quando é depositado no navegador do cliente um dado chamado COOKIE, que é um par de chave-valor.
Métodos
Existem métodos, ou verbos, ou ações diferentes para passarmos informações na hora de criar a requisição no servidor.
GET é o método de buscar, ou receber dados do servidor. Podemos especificar usando os parâmetros na URL. Exemplo:
https://alura.com.br/cursos?buscar=html+css&filtro=web
Depois do sinal de ? vem os parâmetros, que no caso são dois um para buscar o curso e o outro de filtrar a areá de estudo, os dois são concatenados com o sinal de &.
POST É o método usado para submeter os dados ao servidor. Os parâmetros são passados pelo corpo da requisição e não na URL. Assim os dados ficam mais seguros evitando que qualquer um veja.
DELETE É o método utilizado para deletar dados do servidor.
PUT É usado para atualizar dados do servidor.
PATCH é utilizado para atualização parcial do recurso que foi definido.
Serviços REST
(REpresentational State Transfer)
É a requisição e troca de dados entre aplicações, não mais com o cliente, uma aplicação conversa com outra ou um servidor. O REST não devolve como resultado uma página HTML, normalmente é usado o XML e JSON, o que torna mais fácil a implementação nas suas API's.
URI + METHOD
http://alurafood.com/api/restaurante + GET
Retorna todos os restaurante, podendo ser em formato JSON ou XML.
http://alurafood.com/api/restaurante + POST
Nesse caso passaríamos informações de um restaurante para que sejam salvas no banco de dados do servidor.
http://alurafood.com/api/restaurante/1 + DELETE
Esse seria usado quando quisermos deletar um restaurante do banco, passando sempre uma identificação exata de qual restaurante se trata.
http://alurafood.com/api/restaurante/1 + PUT
Este é o método para atualizarmos alguma informação do restaurante no banco, como nome ou endereço. Passando a identificação do restaurante na URI.
Com isso podemos utilizar a mesma URI para varias tarefas apenas mudando o método utilizado, isso é o REST API.
Versão 2 HTTP
Novidade no HEADER
Nesta versão os dados das requisições e nas respostas foram modificados, agora a resposta enviado pelo servidor é comprimida com o GZIP. O dados do header da requisição e resposta são enviado em binários e também comprimidos com o HPACK. Além disso os dados são comprimidos e também criptografados com TLS, o padrão HTTPS de segurança.Tudo isso para otimizar o tráfego de dados na rede e aumentar a segurança das informações.
HEADER STATEFULL
É usado quando enviamos um header ao servidor, ele guarda esse informação e não reenvia até que seja necessário mudar alguma coisa. Enviando assim menos dados redundantes ao servidor e deixando de gastar banda.
SERVER PUSH
É usada quando há uma requisição com mais de um arquivos, como página HTML, CSS, JS e etc, assim o serve envia todos os arquivos necessários para o cliente renderizar a página, quando o navegador foi buscar aqueles arquivos ele verá que já recebeu, evitando tráfego desnecessário na rede.
Multiplexação
Na versão anterior quando o cliente fazia requisições, era criado uma conexão TCP com o servidor, e uma sempre dependia da anterior para continuar, sendo conexões em série e sincronizadas. Para melhorar isso foi desenvolvido o KEEP-ALIVE que mantém no navegador de 4 té 8 requisições TCP no mesmo tempo, porém todas sincronizadas ainda.
Já na versão 2.0, as requisições são enviadas no momento que o cliente necessitar, ou seja são conexões paralelas, e o servidor vai respondendo de acordo com a demanda, fazendo assim uma multi conexão assíncrona entre client-server. Com isso o tráfego fica muito mais ágil e economiza recursos.