# Revisão de HTTP

O protocolo HTTP é um protocolo de comunicação da internet, sendo o HTTP uma das principais maneiras de se tratar trocas de informação quando se trata de desenvolvimento web

A comunicação do HTTP é feita no modelo **cliente-servidor.** Este modelo é dividido em duas partes: o cliente, que pede que o servidor execute alguma função, isto é, faz uma requisição ao servidor; e o servidor, que recebe essas requisições, executa funções específicas, normalmente salvando informações dentro de um banco de dados, e retorna ao cliente uma resposta de como procedeu a requisição.

No próximo capítulo seguinte, iremos nos focar em como realizar as requisições HTTP; enquanto neste, a anatomia de uma requisição será o nosso foco.

## Formato da Requisição

Uma requisição tem algumas partes que a compõem:

* Método de Requisição
* URLs
* Body
* Headers

## Métodos da Requisição

Os métodos são ações que mostram o que deve acontecer pela requisição:

* GET - Recuperar alguma informação.
* POST - Enviar informação ao servidor
* PUT - Atualizar alguma informação no servidor
* DELETE - Deletar informação

## URLs

A URL é geralmente descreve onde que vai ser feito a requisição, normalmente é composto por:

* Host - Descreve o endereço do servidor a ser feito a requisição
* Port (ou porta) - Descreve o ponto de entrada para acessar a aplicação no servidor
* Path (ou caminho) - Descreve onde vai ser solicitado algum recurso da aplicação
* Query - Dados que são enviados junto a, normalmente, uma requisição GET

### Exemplos:

Por exemplo, uma requisição GET pode ser da seguinte maneira:

## Acessar o google&#x20;

<mark style="color:blue;">`GET`</mark> `http://google.com/search?q=bolos`

Método que acessa uma página pesquisando bolos.

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
|      | string |             |

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}

A URL acima pode ser decomposta em diferentes partes:

* **<http://google.com>** - este é o host da URL
* **/search** - este é o caminho que algum recurso vai ser solicitado
* **?q** - esse é o query string que dará os parâmetros pro recurso a ser solicitado, no caso, bolos.

Pode ser usado um um exemplo fictício de uma API tbm:H

## Inserir um item

<mark style="color:green;">`POST`</mark> `http://localhost:3000/item`

Esse método cria um novo item&#x20;

#### Path Parameters

| Name  | Type   | Description    |
| ----- | ------ | -------------- |
| title | string | Titulo do item |

{% tabs %}
{% tab title="200 " %}

```
Item Criado!T
```

{% endtab %}
{% endtabs %}

No exemplo acima, pode-se ver as seguintes partes:

* **<http://localhost>:** - Esse é o host da URL, onde está o servidor.
* **3000** - Essa é a porta de entrada da aplicação, ela aqui não é opcional, pois não é a porta 80.
* **item/** - este é o caminho que algum recurso vai ser solicitado.

Nessa requisição, que requer um body. Este body só precisa de um parâmetro obrigatório, chamado "title".

## Body da Requisição

O body é o corpo da requisição. Nele você envia qualquer tipo de informação relevante a requisição; normalmente são utilizados para compor dados referentes a uma requisição POST.

## Headers da Requisição

Headers são informações adicionais referentes a requisição. Mostra, por exemplo, que software foi utilizado pra realizar a requisição, qual é o tipo de conteúdo está sendo aceito na requisição, entre outros.

## Resposta da Requisição

A resposta de uma requisição é um "cabeçalho" descrevendo como o servidor lidou com a requisição enviada pelo cliente.

As partes que compõem a resposta são:

* Status Code
* Headers
* Conteúdo da Resposta

## Status Code

O status code é um código que mostra o que aconteceu com a requisição após ser realizada pelo servidor. Há uma grande gama de status code; porém, seguem uma regra determinada:

* 1XX - Mostra que a requisição foi recebida, mas nada foi feito ainda.
* 2XX - A requisição foi aceita e teve sucesso.
* 3XX - A requisição precisa ser redirecionada para que a requisição tenha sucesso.
* 4XX - O formato da requisição enviada pelo cliente está errada.
* 5XX - O servidor teve problemas ao realizar a requisição e não pode proceder.

## Headers de Resposta

Descreve informações adicionais referente a requisição, como o tamanho da resposta, qual é o tipo de conteúdo, quando foi aceita a requisição, entre outros.

## Conteúdo da Resposta

Descreve o que foi retornado pelo servidor após a requisição ser enviada pelo cliente.
