Códigos de Status HTTP – Confira Explicação Completa

Entenda de uma vez o significado dos códigos de status HTTP, como eles funcionam, quais os mais comuns e como lidar com cada um deles.

Códigos de status HTTP são a resposta que o servidor devolve a cada requisição. Eles se dividem em cinco famílias: 1XX informativos, 2XX sucesso (200 OK, 201 Created), 3XX redirecionamento (301 permanente, 302 temporário), 4XX erro do lado do cliente (400, 401, 403, 404, 405) e 5XX erro do lado do servidor (500, 501, 502, 503).

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

O que você aprende neste vídeo

Resposta rápida: A aula explica as cinco famílias de códigos de status HTTP e simula os mais comuns num site Flask consultado com a biblioteca requests. Você sai sabendo interpretar códigos como 201, 301, 403, 405 e 503, distinguir erro do cliente de erro do servidor e devolver o status certo em cada rota.

Neste vídeo (32 min):

  • 2:10 - Toda resposta de servidor carrega um código: 200 OK quando a página carrega e 404 numa URL que não existe
  • 6:15 - requests.get() contra o site Flask local, imprimindo o objeto de resposta (<Response [200]>) e o reason, que traz a explicação do código
  • 8:00 - 201 Created: a requisição deu certo e criou um registro, como uma nova matrícula, com o status definido no retorno da rota
  • 9:25 - 202 Accepted para compra aceita e ainda em processamento, e 204 No Content para endpoint que não devolve corpo
  • 12:20 - 301 redirecionamento permanente: rota /link_antigo com redirect(url_for("homepage"), code=301)
  • 15:10 - 302 redirecionamento temporário, com o log do servidor mostrando 302 seguido de 200
  • 16:15 - A família 4xx indica erro do lado do cliente, e a 5xx, erro do lado do servidor
  • 18:10 - 400 Bad Request: rota /usuario/<id> que valida o id com int() dentro de try/except
  • 21:10 - 401 Unauthorized para quem não fez login e 403 Forbidden para usuário logado sem permissão, como na área de admin
  • 24:05 - 405 Method Not Allowed: rota /webhook que só aceita POST recusando uma requisição GET
  • 26:15 - 500 Internal Server Error: rota sem tratamento que quebra ao receber texto no lugar do id, com o modo debug desligado
  • 29:20 - 501 Not Implemented para rota em construção, e o que indicam 502 Bad Gateway e 503 Service Unavailable

Trechos do vídeo:

  • Todo código de status pertence a uma família: 1xx informativo, 2xx sucesso, 3xx redirecionamento, 4xx erro do cliente e 5xx erro do servidor
  • O 301 avisa que o endereço antigo mudou de vez; o 302, que o redirecionamento é temporário e o link pode voltar a funcionar
  • 401 significa que a pessoa não se autenticou; 403, que ela está logada, mas não tem permissão para aquela área
  • Um site bem construído não deixa entrada inválida virar 500: ele valida o dado e responde 400 Bad Request, avisando que a requisição veio no formato errado
  • 501 indica funcionalidade ainda não implementada, enquanto 503 indica um serviço que deveria estar no ar e está indisponível no momento

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Códigos de Status HTTP – Explicação Completa

Na aula de hoje eu vou te mostrar os códigos de status HTTP, explicando seus funcionamentos, quais são os mais comuns de encontrarmos e como lidar com eles para identificar se algo está sendo feito incorretamente ou se o problema está em outro lugar.

Os códigos de status HTTP são utilizados para informar ao usuário sobre problemas ou fornecer informações relacionadas aos erros encontrados. Um exemplo conhecido é o erro 404, que indica que a página não foi encontrada ou não existe.

Além desse código, existem diversos outros status agrupados nas famílias 1XX, 2XX, 3XX, 4XX e 5XX. Durante esta aula, vou apresentar cada uma dessas famílias de códigos de status HTTP.

Para acompanhar o conteúdo, faça o download do material disponível, pois utilizaremos exemplos práticos para ilustrar cada um desses códigos de status.

Além disso, utilizarei o VS Code para esta aula, mas você pode utilizar o editor de códigos da sua preferência.

Instalação do Flask e Requests

Ao longo desta aula, faremos uso das bibliotecas Flask e Requests. Portanto, o primeiro passo será instalar essas duas bibliotecas em seu computador. Para isso, execute o seguinte comando no terminal do seu editor de códigos:

Codigo
pip install flask requests

Como funcionam os códigos de status HTTP

Quando acessamos um site, estamos enviando uma solicitação para o servidor daquele site e, como resposta, o servidor retorna a página que desejamos visualizar. Por exemplo, ao acessar a página inicial do Google.

Página inicial Google

Se a resposta for bem-sucedida, significa que o servidor conseguiu fornecer a página solicitada como resposta à nossa requisição. Toda resposta que recebemos de um servidor está acompanhada por um código de status HTTP.

O código de status enviado pelo servidor quando tudo ocorre conforme esperado e a página do site é carregada normalmente é o código 200, que indica que está tudo ok.

O mesmo ocorre quando tentamos acessar uma página que não existe ou não pode ser encontrada. Nesse caso, o código de status HTTP que recebemos é o conhecido 404.

Google erro 404

Esses são apenas dois dos principais códigos de status HTTP. Por meio de nosso exemplo de código, conheceremos outros códigos importantes das famílias 1XX, 2XX, 3XX, 4XX e 5XX.

Entendendo o código do nosso site

O código presente no material para download é de um site muito simples desenvolvido com Flask. Esse site possui apenas uma página inicial, que exibe a mensagem “Meu site no Ar”.

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

if __name__ == "__main__":
    app.run(debug=True)

Após instalar o Flask e executar esse código, ele colocará o site no ar em um link que representa o seu servidor local, acessível apenas dentro do seu computador.

Link local para acessar o site

Ao acessar esse link, você será redirecionado para o site.

Site no ar

Ao voltarmos para o editor de códigos e observarmos o terminal, poderemos ver os códigos de status HTTP sendo exibidos para o nosso site.

Códigos de status HTTP exibidos no terminal

Ao fazer uma requisição do tipo GET, estamos solicitando informações do site e recebendo uma resposta. Nesse caso, como tudo está funcionando corretamente, o código de status 200 será exibido, indicando que está tudo ok.

Códigos de Status HTTP – 1XX (100)

A primeira família de códigos de status HTTP é a família 1XX. Embora você não encontre muitos desses códigos, é importante conhecer sua existência. Eles são códigos informacionais, retornam apenas respostas informativas sobre a requisição feita.

Códigos de Status HTTP – 2XX (200)

A família dos códigos 2XX são códigos de status HTTP que indicam respostas bem-sucedidas. Eles sinalizam que a requisição foi processada com sucesso.

Existem vários códigos pertencentes à família 2XX que podem ser recebidos. Para simular alguns desses códigos, utilizaremos a biblioteca requests em conjunto com nosso site.

Em outro arquivo, vamos importar a biblioteca requests, criar uma requisição para nosso site e imprimir essa requisição, bem como a requisicao.reason, que exibe a explicação do código de resposta.

Python
import requests

requisicao = requests.get("http://127.0.0.1:5000/")

print(requisicao)
print(requisicao.reason)

Ao executar esse código com nosso site aberto, obteremos o código de status 200, e requisicao.reason retornará o texto “OK“, indicando que recebemos uma resposta bem-sucedida.

Código 200

O próximo código da família 2XX é o código de status HTTP 201. Além de indicar que a requisição foi bem-sucedida, ele representa o status de CREATED.

Para visualizarmos isso, faremos uma modificação no código de nosso site, adicionando o código 201 ao retorno da nossa página.

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar", 201

if __name__ == "__main__":
    app.run(debug=True)
Ícone PythonPython Impressionador

Você vai aprender a linguagem de Programação que mais cresce no Mundo para fazer automações incríveis, desenvolver sites, fazer análises de dados, trabalhar com Ciência de Dados, Inteligência Artificial, mesmo que você nunca tenha tido nenhum contato com Programação na vida.

Começar agoraSeta para a direita
Fundo PythonTelas Python
Luz Python

Ao fazer uma requisição para nosso site, agora receberemos como resposta o código 201 e a mensagem CREATED. Essa resposta indica que, além da requisição ter sido bem-sucedida, um novo registro foi criado no sistema.

Por exemplo, quando um aluno visita o site da Hashtag e realiza a matrícula em um dos nossos cursos, ele receberá uma resposta de sucesso, bem como o código 201 de CREATED, pois o registro daquela matrícula foi criado no sistema.

Muitos sites acabam retornando apenas o status 200 para o usuário final, mesmo em casos em que ocorre a criação de um novo registro no sistema. Isso ocorre porque, como vimos, podemos definir o código que desejamos retornar no return de nosso site.

Agora, veremos o código 202, o próximo da família 2XX. Esse código representa a mensagem ACCEPTED, que significa que a requisição foi aceita e está sendo processada, mas o servidor ainda não terminou de processar todas as informações contidas nela.

Voltando ao exemplo do aluno, quando ele compra um dos cursos, é necessário realizar diversas configurações para esse usuário na plataforma. Portanto, retornamos o código 202 de ACCEPTED. Isso significa que a compra foi bem-sucedida, a requisição foi aceita, mas ainda existem informações sendo processadas.

O último código de status HTTP que veremos nessa família é o 204, que representa o NO CONTENT Esse status indica que a requisição foi bem-sucedida, mas não há conteúdo para ser retornado pelo servidor como resposta.

Códigos de Status HTTP – 3XX (300)

Os códigos de Status HTTP da família 3XX, são códigos de redirecionamento. Esses códigos são retornados quando a resposta da requisição não está no local exato onde foi solicitada. Isso pode ocorrer quando o endereço foi alterado permanentemente ou quando há mais de uma resposta possível para a requisição.

O primeiro código dessa família que veremos é o 301. Ele indica que a URL solicitada foi permanentemente modificada, e a nova URL é retornada como resposta para o usuário, redirecionando-o para ela.

Para visualizarmos isso com nossos exemplos, criaremos um novo endpoint para nosso site.

É importante lembrar que o objetivo dessa aula é compreender melhor os códigos de status HTTP. Caso queira aprender mais sobre a criação de sites com Flask, recomendo nosso minicurso gratuito de criação de sites com Python, onde você aprenderá a criar uma réplica do Pinterest.

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

@app.route("/link_antigo")
def sumiu():
    return redirect(url_for("homepage"), code=301)

if __name__ == "__main__":
    app.run(debug=True)

Com isso, criamos o que seria um link antigo que redireciona para a homepage atual do site. Se fizermos uma requisição para esse endereço usando o link antigo:

Python
import requests

requisicao = requests.get("http://127.0.0.1:5000/link_antigo")

print(requisicao)
print(requisicao.reason)

Receberemos como resposta o código da página inicial, ou seja, o código 200, indicando que está tudo certo, pois o usuário foi redirecionado para a homepage. No entanto, se observarmos o registro do servidor do nosso site, veremos que antes disso, foi retornado o código 301.

Código 301

Esse código é utilizado quando você redireciona a partir de um link que não existe mais e não existirá mais em seu site. Um link que foi modificado permanentemente.

Outro código similar dessa família é o 302. No entanto, ao contrário do 301, esse código de status é retornado quando o endereço solicitado foi modificado temporariamente. Ou seja, por enquanto, esse link levará para um redirecionamento, mas futuramente pode ser que ele receba outra atribuição.

Códigos de Status HTTP – 4XX (400)

Os códigos da família 4XX são códigos de status HTTP que retornam respostas de erro ao usuário. Esses códigos são gerados quando a causa do erro provém do lado do cliente, e não do servidor.

O primeiro código que veremos é o 400, que indica o erro de Bad Request. Esse código significa que o usuário está enviando uma requisição em um formato incorreto.

Para visualizarmos isso, criaremos mais um endpoint para nosso site:

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

@app.route("/link_antigo")
def sumiu():
    return redirect(url_for("homepage"), code=301)

@app.route("/usuario/<id>")
def usuario(id):
    try:
        id = int(id)
        return f"Usuário {id} carregado com sucesso"
    except:
        return "Erro na requisição", 400

if __name__ == "__main__":
    app.run(debug=True)

Dessa forma, criamos um link que direciona para a página do usuário. Para identificar qual usuário será acessado, passamos um ID no endereço, que deve ser um número inteiro.

Requisição correta

Agora, se o cliente fizer uma requisição com algo que não seja um número inteiro na URL, ele receberá o erro 400.

Erro 400

No registro do servidor, podemos ver o status 400.

Código de Status HTTP 400

Outro código de status HTTP importante da família 4XX é o 401. Esse status é chamado de Unauthorized.

Ele é retornado quando o usuário tenta acessar ou fazer uma requisição a um endereço no qual ele não está autenticado. Isso significa que o usuário ainda não se cadastrou ou fez login no servidor, e sua identidade não é conhecida pelo servidor.

Ao contrário do 401, temos o código de status 403, o Forbidden. Nesse caso, o usuário já é reconhecido pelo servidor, mas não tem permissão de acesso ao recurso solicitado em sua requisição. Por exemplo, tentar acessar o painel de administração de um site.

Nessa família também temos o famoso erro 404 de página não encontrada.

Por fim, veremos o erro 405, o Method Not Allowed. Esse erro ocorre quando o método da requisição é conhecido pelo servidor, mas não é permitido.

Por exemplo, imagine que seu site ou API possui um webhook (um link que permite o envio de informações para o seu site). Vamos criar um exemplo de webhook que aceita apenas requisições do tipo POST (envio de informações para o site)

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

@app.route("/link_antigo")
def sumiu():
    return redirect(url_for("homepage"), code=301)

@app.route("/usuario/<id>")
def usuario(id):
    try:
        id = int(id)
        return f"Usuário {id} carregado com sucesso"
    except:
        return "Erro na requisição", 400

@app.route("/webhook", methods=["POST"])
def webhook():
    return "OK"

if __name__ == "__main__":
    app.run(debug=True)

Se tentarmos acessar esse link de webhook pelo navegador ou fizermos uma requisição do tipo GET para ele usando nosso código, receberemos o erro 405.

Python
import requests

requisicao = requests.get("http://127.0.0.1:5000/webhook")

print(requisicao)
print(requisicao.reason)
Erro 405

Códigos de Status HTTP – 5XX (500)

Assim como a família dos códigos 4XX retornam erros por parte do usuário. A família de códigos 5XX são códigos de status HTTP que retornam respostas de erros provenientes do lado do servidor.

O código mais comum é o 500, Internal Server Error (erro interno do servidor), que indica um problema não especificado no lado do servidor.

Para ilustrar esse erro, vamos adicionar uma funcionalidade em nosso site que permite visualizar a foto do usuário. Quando o usuário acessar o endpoint /foto_usuario/<id>, a função foto_usuario(id) será acionada. Porém, nesse caso, não faremos validações para lidar com um ID inválido.

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

@app.route("/link_antigo")
def sumiu():
    return redirect(url_for("homepage"), code=301)

@app.route("/usuario/<id>")
def usuario(id):
    try:
        id = int(id)
        return f"Usuário {id} carregado com sucesso"
    except:
        return "Erro na requisição", 400

@app.route("/webhook", methods=["POST"])
def webhook():
    return "OK"

@app.route("/foto_usuario/<id>")
def foto_usuario(id):
    id = int(id)
    return f"Foto do usuario {id} carregado com sucesso"

if __name__ == "__main__":
    app.run()

Ao acessar um ID inválido, em vez de receber uma mensagem de erro 400, o usuário verá uma mensagem de erro interno do servidor. Isso indica que há um problema no servidor que precisa ser corrigido.

Código de Status HTTP 500 - Internal Server Error

Outro código de status importante é o 501, Not Implemented. Esse código é retornado quando uma parte do site ainda está em construção e não foi implementada. A funcionalidade existe, mas ainda não está ativa, não foi feito o deploy dela.

No nosso exemplo, podemos adicionar um endpoint /postar_foto que retorna uma mensagem “Em construção” com o código 501.

Python
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def homepage():
    return "Meu site no Ar"

@app.route("/link_antigo")
def sumiu():
    return redirect(url_for("homepage"), code=301)

@app.route("/usuario/<id>")
def usuario(id):
    try:
        id = int(id)
        return f"Usuário {id} carregado com sucesso"
    except:
        return "Erro na requisição", 400

@app.route("/webhook", methods=["POST"])
def webhook():
    return "OK"

@app.route("/foto_usuario/<id>")
def foto_usuario(id):
    id = int(id)
    return f"Foto do usuario {id} carregado com sucesso"

@app.route("/postar_foto")
def postar_foto():
    return "Em construção", 501

if __name__ == "__main__":
    app.run(debug=True)
Mensagem "Em Construção"
Códigos de Status HTTP 501

Outro código de status é o 502, Bad Gateway. Esse erro ocorre quando o servidor recebe uma resposta inválida ao tentar lidar com uma solicitação.

Isso geralmente acontece quando o site precisa se comunicar com um serviço externo ou outro servidor, e ocorre um problema na comunicação entre eles.

Por fim, o código de status 503, Service Unavailable , indica que o servidor não está preparado para lidar com a solicitação. Isso pode ocorrer quando o servidor está em manutenção ou sobrecarregado.

Esses códigos de status da família 5XX são úteis para identificar e solucionar problemas no servidor, permitindo que os administradores do site possam corrigir as falhas e garantir uma experiência melhor aos usuários.

Perguntas frequentes

1. O que significa o código de status 200?

O 200, que responde como OK, faz parte da família 2XX e indica que a requisição foi processada com sucesso: o servidor entregou a página ou o dado pedido. Um parente próximo é o 201, Created, devolvido quando a requisição além de dar certo criou um recurso novo no servidor.

2. Qual a diferença entre os códigos 301 e 302?

Os dois são redirecionamentos da família 3XX. O 301 avisa que o endereço mudou em definitivo e o antigo não volta mais, sendo o indicado quando você aposenta uma URL. Já o 302 sinaliza desvio temporário: aquele endereço pode receber outra função depois.

3. O que causa o erro 500 em um site?

O 500, Internal Server Error, é da família 5XX, ou seja, o problema está no servidor e não em quem acessou. Costuma aparecer quando o código quebra sem tratamento, como no exemplo da aula com um ID inválido sem validação. Vizinhos dele são o 501, o 502 e o 503.

4. Como ver o código de status de uma requisição em Python?

Com a biblioteca requests: faça requisicao = requests.get(url) e imprima requisicao.status_code para o número e requisicao.reason para a descrição, como OK ou Not Found. No terminal em que o site Flask está rodando também aparece o registro de cada requisição com o código devolvido.

Conclusão – Códigos de Status HTTP

Nesta aula, aprendemos sobre os códigos de status HTTP, o que são e como funcionam. Exploramos os principais e mais comuns códigos que encontramos ao trabalhar com o desenvolvimento de sites.

Além disso, exemplifiquei como e quando cada um desses códigos acontece através de um código simples de um site criado com Flask. Caso queira se aprofundar mais no desenvolvimento de sites com Flask no Python, não se esqueça do nosso minicurso gratuito.

É importante ressaltar que existem outros códigos de status HTTP que não foram abordados nesta aula, no entanto, os códigos mencionados são os principais e mais frequentes. Portanto, ao se deparar com qualquer um desses códigos, você já terá conhecimento do que se trata e se está cometendo algum erro ou não.

Hashtag Treinamentos

Para acessar outras publicações de Python, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?