☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

domingo, 8 de julho de 2018

☕💣 OPERADOR, ANTES DE EXISTIR O COBOL EXISTIA A LÓGICA! — O SEGREDO QUE TRANSFORMA APRENDIZES EM MESTRES DO MAINFRAME

 

Bellacosa Mainframe e a logica de programação estruturada para mainframe

☕💣 OPERADOR, ANTES DE EXISTIR O COBOL EXISTIA A LÓGICA! — O SEGREDO QUE TRANSFORMA APRENDIZES EM MESTRES DO MAINFRAME

Por que tantos profissionais aprendem COBOL, mas poucos se tornam realmente programadores?

Existe uma crença muito comum entre iniciantes no universo Mainframe:

"Se eu decorar comandos COBOL, vou aprender a programar."

Mas a realidade é outra.

Um programador COBOL experiente sabe que a linguagem é apenas uma ferramenta.

O verdadeiro diferencial está na lógica.

Quando observamos um sistema bancário executando milhões de transações por dia, um processamento batch consolidando contas correntes ou um programa CICS consultando dados em tempo real, o que realmente está funcionando por trás das telas verdes não é COBOL.

É a lógica.

O COBOL apenas traduz essa lógica para o computador.

Por isso, antes de estudar comandos avançados, VSAM, DB2, MQ ou CICS, é fundamental compreender os pilares da programação.

E curiosamente esses mesmos pilares já existiam muito antes dos computadores modernos.


O que é um algoritmo no mundo Mainframe?

A definição clássica diz que algoritmo é uma sequência finita de passos para resolver um problema.

No Mainframe podemos enxergar um algoritmo como um JOB.

Observe:

Exemplo cotidiano

Preparar café.

  1. Colocar água.

  2. Adicionar pó.

  3. Aquecer.

  4. Coar.

  5. Servir.

Existe uma sequência.

Se invertermos os passos, o resultado não será o esperado.


Exemplo Mainframe

Processar folha de pagamento.

  1. Ler arquivo de funcionários.

  2. Ler tabela salarial.

  3. Calcular salário.

  4. Calcular impostos.

  5. Gerar relatório.

  6. Atualizar arquivo mestre.

Perceba:

Um programa COBOL nada mais é que uma sequência organizada de passos.

Isso é um algoritmo.


O algoritmo invisível que existe em todo JOB

Quando um operador submete um JCL:

//JOB001 JOB ...
//STEP01 EXEC PGM=LEFUNC
//STEP02 EXEC PGM=CALCSAL
//STEP03 EXEC PGM=RELATOR

O JCL é um algoritmo.

Ele determina:

  • O que executar.

  • Em qual ordem.

  • Quais dados utilizar.

  • Qual resultado produzir.

Sem lógica não existe processamento.


O conceito mais importante de toda programação

Todo programa responde a três perguntas:

O que entra?

Input.

O que acontece?

Processamento.

O que sai?

Output.


Exemplo COBOL

Imagine um programa que calcula a média de um aluno.

Entrada:

01 WS-NOTA1 PIC 9(3)V99.
01 WS-NOTA2 PIC 9(3)V99.

Processamento:

COMPUTE WS-MEDIA =
        (WS-NOTA1 + WS-NOTA2) / 2.

Saída:

DISPLAY "MEDIA = " WS-MEDIA.

Observe:

Entrada → Processamento → Saída

Esse modelo está presente em praticamente todos os sistemas Mainframe.


Tipos de dados: os tijolos da programação COBOL

Todo programa trabalha com dados.

No COBOL eles são definidos na DATA DIVISION.


Dados numéricos

Exemplos:

01 WS-IDADE PIC 999.
01 WS-SALARIO PIC 9(7)V99.

Utilizados para:

  • cálculos;

  • somatórios;

  • médias;

  • juros;

  • impostos.


Dados alfanuméricos

Exemplos:

01 WS-NOME PIC X(40).
01 WS-CPF  PIC X(11).

Utilizados para:

  • nomes;

  • documentos;

  • códigos;

  • mensagens.


Dados lógicos no COBOL

COBOL não possui BOOLEAN clássico como linguagens modernas.

Normalmente utilizamos:

88 CLIENTE-ATIVO VALUE 'S'.
88 CLIENTE-INATIVO VALUE 'N'.

Ou:

01 WS-STATUS PIC X.

   88 APROVADO VALUE 'A'.
   88 REPROVADO VALUE 'R'.

Esse recurso é extremamente utilizado em sistemas bancários.


Variáveis: os registradores da aplicação

Uma variável representa uma área de memória.

Exemplo:

01 WS-SALDO PIC S9(9)V99 COMP-3.

Durante a execução:

MOVE 1000 TO WS-SALDO.

Depois:

ADD 500 TO WS-SALDO.

Valor atual:

1500

A variável mudou.

Por isso ela recebe esse nome.


Constantes em COBOL

Valores fixos normalmente são definidos com VALUE.

01 WS-TAXA-JUROS PIC 9V999
   VALUE 0.125.

Ou:

01 WS-PI PIC 9V99999
   VALUE 3.14159.

O conceito é simples:

Uma constante não deve mudar.


MOVE: o comando mais utilizado do COBOL

Na apostila existe o conceito de atribuição.

No COBOL isso ocorre principalmente através do comando MOVE.

Exemplo:

MOVE 100 TO WS-SALDO.

Significa:

"Coloque o valor 100 dentro da variável."

Outro exemplo:

MOVE WS-NOME TO WS-NOME-CLIENTE.

Equivale à atribuição de uma variável para outra.


Entrada e saída de dados no Mainframe

Em linguagens acadêmicas encontramos:

Leia
Escreva

No COBOL encontramos:

READ
WRITE
DISPLAY
ACCEPT


Entrada de dados

Terminal:

ACCEPT WS-NOME.

Arquivo:

READ ARQ-CLIENTES

Saída de dados

Tela:

DISPLAY WS-NOME.

Arquivo:

WRITE REG-SAIDA.

Relatório:

WRITE LINHA-RELATORIO.

Operadores matemáticos no COBOL

O COBOL utiliza verbos muito próximos da linguagem humana.


Soma

ADD A TO B.

Subtração

SUBTRACT A FROM B.

Multiplicação

MULTIPLY A BY B.

Divisão

DIVIDE A INTO B.

Fórmulas complexas

COMPUTE WS-MEDIA =
       (WS-NOTA1 + WS-NOTA2) / 2.

O COMPUTE é um dos comandos mais poderosos da linguagem.


Operadores relacionais

São utilizados para comparar valores.


Igual

IF WS-IDADE = 18

Maior

IF WS-SALDO > 1000

Menor

IF WS-SALDO < 0

Diferente

IF WS-STATUS NOT = 'A'

O poder do IF

Todo sistema bancário depende de decisões.

A decisão é implementada através do IF.


Exemplo

IF WS-SALDO > 0
    DISPLAY "CONTA POSITIVA"
END-IF.

Exemplo bancário

IF WS-LIMITE > WS-VALOR-SAQUE
    PERFORM EFETUA-SAQUE
ELSE
    PERFORM NEGA-SAQUE
END-IF.

Observe:

O programa está tomando decisões.

Isso é lógica.


EVALUATE: o SWITCH/CASE do COBOL

Em outras linguagens existe SWITCH.

No COBOL moderno utilizamos:

EVALUATE WS-STATUS
   WHEN 'A'
      DISPLAY 'ATIVO'
   WHEN 'I'
      DISPLAY 'INATIVO'
   WHEN OTHER
      DISPLAY 'INVALIDO'
END-EVALUATE.

Muito comum em sistemas corporativos.


Estruturas de repetição no COBOL

Um dos conceitos mais importantes da programação.

Imagine um arquivo com 50 milhões de registros.

Como processar tudo?

Com laços de repetição.


PERFORM UNTIL

PERFORM UNTIL EOF = 'S'

   READ ARQ-CLIENTES
      AT END
         MOVE 'S' TO EOF
   END-READ

END-PERFORM.

Esse é provavelmente um dos padrões mais encontrados no Mainframe.


O algoritmo clássico de processamento batch

Observe a lógica utilizada em milhares de programas COBOL:

ABRIR ARQUIVOS

LER PRIMEIRO REGISTRO

ENQUANTO NÃO FOR FIM DO ARQUIVO

   PROCESSAR

   LER PRÓXIMO REGISTRO

FIM-ENQUANTO

FECHAR ARQUIVOS

Transformado para COBOL:

OPEN INPUT ARQ-CLIENTES

PERFORM UNTIL EOF = 'S'

   READ ARQ-CLIENTES
      AT END
         MOVE 'S' TO EOF
      NOT AT END
         PERFORM PROCESSA-REGISTRO
   END-READ

END-PERFORM

CLOSE ARQ-CLIENTES.

Esse padrão existe há décadas.

E continua executando boa parte da economia mundial.


A lógica por trás de CICS

Muitos acreditam que CICS é algo completamente diferente.

Mas a lógica é a mesma.

Entrada:

EXEC CICS RECEIVE

Processamento:

IF
EVALUATE
COMPUTE

Saída:

EXEC CICS SEND

Novamente:

Entrada → Processamento → Saída.


O segredo dos grandes programadores COBOL

Os melhores profissionais não decoram comandos.

Eles aprendem a pensar.

Quando recebem uma demanda, primeiro desenham a lógica.

Depois escrevem o código.

Por isso um profissional experiente consegue aprender:

  • COBOL

  • PL/I

  • Natural

  • Java

  • Python

  • C#

Porque a lógica permanece.

A linguagem muda.

O raciocínio não.


Conclusão

Todo sistema Mainframe que processa cartões, PIX, contas correntes, seguros, previdência, telecomunicações ou governo possui a mesma fundação:

Algoritmos.

Variáveis.

Decisões.

Repetições.

Processamento de dados.

O COBOL não é apenas uma linguagem.

Ele é a materialização de uma lógica extremamente bem estruturada, criada para representar regras de negócio de forma clara e confiável.

Quem domina apenas comandos escreve programas.

Quem domina lógica constrói sistemas que sobrevivem décadas.

E talvez esse seja o maior segredo do Mainframe:

Os computadores mudaram.

As telas mudaram.

As linguagens mudaram.

Mas a lógica continua exatamente a mesma desde os primeiros dias da computação.



sábado, 7 de julho de 2018

Blog Analytics : Parte V – Construindo o Bellacosa Blog Doctor Desenvolvendo um Scanner Automático de HTML, SEO e Qualidade para Blogger

 

Bellacosa Mainframe e o blog analytics parte v

☕ Um Café no Bellacosa Mainframe

Blog Analytics : Parte V – Construindo o Bellacosa Blog Doctor

Desenvolvendo um Scanner Automático de HTML, SEO e Qualidade para Blogger

Quando o Feed Atom Deixa de Ser Apenas um Arquivo XML e se Transforma no SYSUDUMP de um Acervo Digital

☕ Um Café no Bellacosa Mainframe

Nas quatro primeiras partes desta série percorremos um caminho que começou com uma suspeita aparentemente pequena e terminou em uma descoberta muito maior.

Primeiro percebemos que o Blogger podia armazenar HTML invisível.

Depois identificamos os resíduos deixados por inteligência artificial, Microsoft Word, Google Docs e outros editores.

Em seguida aprendemos que limpar milhares de posts sem planejamento poderia causar mais problemas do que benefícios.

Por fim, construímos um checklist de auditoria para blogs antigos, tratando um acervo editorial como um sistema crítico que precisa de manutenção preventiva.

Agora chegamos ao ponto em que a teoria precisa virar ferramenta.

Não basta saber que existem resíduos.

Não basta abrir manualmente cada artigo.

Não basta analisar visualmente milhares de páginas.

Precisamos de um scanner.

Um programa capaz de receber o Feed Atom de um blog, percorrer milhares de publicações, interpretar o HTML, aplicar regras de qualidade, calcular indicadores, classificar riscos e produzir um relatório compreensível.

Em outras palavras:

Precisamos construir o Bellacosa Blog Doctor.


O Que é o Bellacosa Blog Doctor?

O Bellacosa Blog Doctor é uma ferramenta de auditoria técnica para Blogger.

Seu objetivo não é editar automaticamente todos os artigos.

Seu objetivo é muito mais importante:

diagnosticar antes de corrigir.

Em ambientes IBM Mainframe, ninguém altera um sistema crítico sem antes reunir evidências.

Primeiro olhamos:

  • logs;

  • dumps;

  • traces;

  • métricas;

  • códigos de retorno;

  • históricos de execução;

  • impactos;

  • dependências.

Somente depois decidimos o que fazer.

O Blog Doctor segue exatamente essa filosofia.

Ele não deve agir como um aspirador de pó cego que remove tudo que parece estranho.

Ele deve funcionar como um laboratório forense digital.

Receber dados.

Analisar.

Classificar.

Explicar.

Priorizar.

Gerar um laudo.


A Filosofia Mainframe Aplicada ao Blogger

Um mainframe não é confiável apenas porque possui hardware robusto.

Ele é confiável porque toda sua operação é baseada em controle, observabilidade e diagnóstico.

Quando um job falha, existem pistas:

  • RC;

  • ABEND;

  • SYSOUT;

  • JESMSGLG;

  • JESYSMSG;

  • CEEDUMP;

  • SYSUDUMP;

  • mensagens do subsistema;

  • registros SMF.

O Blog Doctor deve produzir o equivalente editorial dessas evidências.

Por exemplo:

POST: ABEND sem Mistérios para Programadores COBOL

STATUS GERAL..............ATENÇÃO

HTML......................82
SEO TÉCNICO...............91
ACESSIBILIDADE............76
QUALIDADE EDITORIAL.......94

OCORRÊNCIAS:
- 3 imagens sem ALT
- 1 tabela dentro de parágrafo
- 2 links HTTP
- 4 atributos data-message-id
- heading H3 sem H2 anterior

PRIORIDADE.................MÉDIA
AÇÃO RECOMENDADA...........REVISÃO MANUAL

Esse relatório funciona como um pequeno dump do artigo.

Não diz apenas que existe um problema.

Mostra:

  • onde;

  • qual;

  • quantas vezes;

  • qual gravidade;

  • qual ação recomendada.


A Arquitetura da Ferramenta

Antes de escrever código, precisamos desenhar a arquitetura.

Uma ferramenta de auditoria bem organizada pode ser dividida em cinco camadas.

CAMADA 1 – AQUISIÇÃO
Feed Atom ou Blogger API

CAMADA 2 – NORMALIZAÇÃO
Conversão dos posts para objetos internos

CAMADA 3 – ANÁLISE
HTML, SEO, acessibilidade, conteúdo e metadados

CAMADA 4 – CLASSIFICAÇÃO
Score, gravidade, prioridade e recomendações

CAMADA 5 – RELATÓRIOS
Dashboard, CSV, JSON, tabelas e laudos

Essa separação é fundamental.

Sem ela, o programa rapidamente se transforma em um bloco gigantesco de JavaScript difícil de manter.

No universo mainframe, seria como colocar leitura de arquivo, regra de negócio, banco de dados, impressão e tratamento de erro dentro de uma única SECTION COBOL.

Pode até funcionar.

Mas ninguém gostaria de manter.


Camada 1 – Aquisição dos Dados

O primeiro módulo precisa localizar e carregar os artigos.

Existem duas fontes principais.

Feed Atom

O Feed Atom é excelente para análise porque fornece o conteúdo publicado em formato estruturado.

Ele pode conter:

  • título;

  • data de publicação;

  • data de atualização;

  • categorias;

  • links;

  • HTML completo do artigo.

Exemplo simplificado:

<entry>
  <title>ABEND sem Mistérios</title>
  <published>2026-07-25T20:00:00-03:00</published>
  <category term="COBOL"/>
  <category term="Mainframe"/>
  <content type="html">
    <![CDATA[
      <h2>Introdução</h2>
      <p>Conteúdo...</p>
    ]]>
  </content>
</entry>

O Feed Atom funciona quase como uma unload de banco de dados.

Ele não representa apenas aquilo que aparece visualmente.

Ele revela aquilo que foi armazenado.


Blogger API

A Blogger API fornece dados em JSON.

Isso facilita o processamento porque JavaScript trabalha naturalmente com objetos JSON.

Exemplo:

{
  "title": "ABEND sem Mistérios",
  "published": "2026-07-25T20:00:00-03:00",
  "labels": ["COBOL", "Mainframe"],
  "content": "<h2>Introdução</h2><p>Conteúdo...</p>"
}

Em um projeto mais maduro, o Blog Doctor pode oferecer as duas opções:

  • leitura direta do Feed Atom;

  • leitura da Blogger API.


O Problema da Paginação

Blogs pequenos podem ser lidos em uma única requisição.

Blogs com milhares de posts não.

Tentar carregar quatro mil artigos de uma vez pode gerar:

  • timeout;

  • resposta truncada;

  • consumo elevado de memória;

  • travamento do navegador;

  • falhas de rede;

  • bloqueio temporário.

A solução é processar em lotes.

async function carregarPosts() {
  const lote = 100;
  let inicio = 1;
  const posts = [];

  while (true) {
    const dados = await carregarLote(inicio, lote);

    if (!dados.length) {
      break;
    }

    posts.push(...dados);
    inicio += dados.length;

    if (dados.length < lote) {
      break;
    }
  }

  return posts;
}

Essa lógica lembra um programa batch lendo um arquivo em blocos.

Não importa se existem cem ou dez mil registros.

O processo continua até encontrar o fim.


Camada 2 – Normalização

Os dados recebidos do Feed Atom não devem ser usados diretamente em todas as funções.

Primeiro precisam ser normalizados.

Isso significa converter cada post para um formato interno consistente.

{
  titulo: "ABEND sem Mistérios",
  url: "https://...",
  publicadoEm: Date,
  atualizadoEm: Date,
  html: "<h2>...</h2>",
  texto: "ABEND sem Mistérios...",
  palavras: 1842,
  caracteres: 10920,
  marcadores: ["COBOL", "Mainframe"],
  imagens: [],
  links: [],
  headings: []
}

Esse objeto se transforma no registro mestre da auditoria.

Em COBOL, seria como montar um layout padronizado na WORKING-STORAGE antes de aplicar as regras de negócio.


Convertendo HTML em Texto

Um dos primeiros algoritmos necessários é remover o HTML para obter apenas o conteúdo textual.

function htmlParaTexto(html) {
  const documento = new DOMParser()
    .parseFromString(html, "text/html");

  documento
    .querySelectorAll("script, style, noscript")
    .forEach(elemento => elemento.remove());

  return (documento.body.textContent || "")
    .replace(/\s+/g, " ")
    .trim();
}

Essa função permite calcular:

  • palavras;

  • caracteres;

  • densidade textual;

  • repetições;

  • legibilidade;

  • termos mais usados.


Contando Palavras

A contagem não deve usar apenas:

texto.split(" ")

Esse método falha com:

  • múltiplos espaços;

  • quebras de linha;

  • pontuação;

  • hífens;

  • apóstrofos.

Uma abordagem melhor é usar expressão regular Unicode.

function contarPalavras(texto) {
  const palavras = texto.match(
    /[\p{L}\p{N}][\p{L}\p{N}'’-]*/gu
  );

  return palavras ? palavras.length : 0;
}

O uso de \p{L} ajuda a reconhecer letras acentuadas e outros alfabetos.

Isso é importante em um blog que mistura português, inglês, japonês romanizado, termos técnicos e nomes próprios.


Camada 3 – O Motor de Análise

Aqui está o verdadeiro coração do Bellacosa Blog Doctor.

Cada módulo analisa um aspecto diferente.

MÓDULO HTML
MÓDULO SEO
MÓDULO ACESSIBILIDADE
MÓDULO EDITORIAL
MÓDULO LINKS
MÓDULO IMAGENS
MÓDULO RESÍDUOS
MÓDULO PERFORMANCE

Cada módulo deve produzir ocorrências independentes.

Exemplo:

{
  codigo: "HTML-TABLE-IN-P",
  categoria: "HTML",
  gravidade: "media",
  mensagem: "Tabela encontrada dentro de parágrafo",
  quantidade: 1
}

Scanner de HTML

O scanner de HTML deve procurar estruturas inválidas ou suspeitas.

Tabela dentro de parágrafo

const tabelaEmParagrafo =
  /<p\b[^>]*>\s*<table\b/i.test(html);

Tabela dentro de heading

const tabelaEmHeading =
  /<h[1-6]\b[^>]*>\s*<table\b/i.test(html);

Headings vazios

const headingsVazios = [
  ...documento.querySelectorAll("h1,h2,h3,h4,h5,h6")
].filter(elemento => !elemento.textContent.trim());

Mais de um H1

const quantidadeH1 =
  documento.querySelectorAll("h1").length;

Essas regras parecem simples, mas quando aplicadas a milhares de posts revelam padrões históricos inteiros.


Scanner de Resíduos de IA

Os resíduos deixados por interfaces modernas podem ser identificados por padrões conhecidos.

const residuosIA = [
  /data-message-id\s*=/i,
  /data-message-author-role\s*=/i,
  /data-message-model-slug\s*=/i
];

O algoritmo pode contar cada ocorrência.

function contarPadrao(html, regex) {
  const global = new RegExp(regex.source, regex.flags + "g");
  return (html.match(global) || []).length;
}

Resultado:

data-message-id...............12
data-message-author-role.......4
data-message-model-slug........4

Isso permite identificar não apenas se existe resíduo, mas sua intensidade.


Scanner de Microsoft Word

O Word possui uma assinatura bastante reconhecível.

const possuiWord =
  /\bclass=["'][^"']*\bMso/i.test(html) ||
  /<o:p\b/i.test(html) ||
  /mso-[a-z-]+\s*:/i.test(html);

Também é possível detectar comentários condicionais:

<!--[if gte mso 9]>

Esses resíduos normalmente não quebram a página.

Mas aumentam o tamanho do HTML e tornam a manutenção mais difícil.


Scanner de Google Docs

O Google Docs costuma deixar estruturas mais limpas que o Word, porém pode inserir grande quantidade de spans e estilos inline.

Uma regra simples pode medir densidade de spans.

const spans =
  documento.querySelectorAll("span").length;

const palavras =
  contarPalavras(texto);

const densidadeSpan =
  palavras > 0 ? spans / palavras : 0;

Exemplo:

Palavras..............1.000
Spans...................480
Densidade..............0,48

Uma densidade muito alta pode indicar excesso de formatação.


Análise de Headings

A hierarquia de títulos é essencial para organização semântica.

Um scanner deve verificar:

  • H1 duplicado;

  • H2 ausente;

  • H3 sem H2 anterior;

  • saltos de H2 para H4;

  • headings vazios;

  • headings excessivamente longos.

Algoritmo simplificado:

function analisarHierarquiaHeadings(documento) {
  const headings = [
    ...documento.querySelectorAll("h1,h2,h3,h4,h5,h6")
  ];

  const problemas = [];
  let nivelAnterior = 0;

  headings.forEach(heading => {
    const nivel = Number(heading.tagName.substring(1));

    if (nivelAnterior && nivel > nivelAnterior + 1) {
      problemas.push({
        tipo: "salto-heading",
        de: nivelAnterior,
        para: nivel,
        texto: heading.textContent.trim()
      });
    }

    nivelAnterior = nivel;
  });

  return problemas;
}

Isso funciona como um verificador de estrutura de programa.

É quase um compiler warning editorial.


Scanner de Imagens

Cada imagem deve ser analisada.

const imagens = [
  ...documento.querySelectorAll("img")
];

Para cada uma:

{
  src: imagem.src,
  alt: imagem.getAttribute("alt"),
  title: imagem.getAttribute("title"),
  width: imagem.getAttribute("width"),
  height: imagem.getAttribute("height")
}

Problemas possíveis:

  • ausência de ALT;

  • ALT vazio;

  • URL HTTP;

  • imagem sem dimensões;

  • imagem externa;

  • possível arquivo pesado;

  • imagem duplicada;

  • nome de arquivo genérico.

Exemplo de diagnóstico:

IMG-ALT-MISSING
Gravidade: média
Ocorrências: 3

Scanner de Links

Links quebrados são uma das maiores dívidas técnicas de blogs antigos.

O scanner local pode verificar inicialmente:

  • HTTP;

  • links vazios;

  • href="#";

  • JavaScript no href;

  • links internos;

  • links externos;

  • links duplicados.

const linksHTTP = links.filter(link =>
  /^http:\/\//i.test(link.getAttribute("href") || "")
);

Verificar se uma URL externa realmente responde exige chamadas de rede e pode sofrer limitações de CORS.

Por isso, o Blog Doctor pode classificar a análise em dois níveis:

Nível local

  • estrutura do link;

  • protocolo;

  • domínio;

  • duplicação;

  • consistência.

Nível remoto

  • código HTTP;

  • redirect;

  • página removida;

  • timeout.


Scanner de Conteúdo

O conteúdo também pode ser avaliado.

Indicadores possíveis:

  • quantidade de palavras;

  • tamanho do título;

  • presença de introdução;

  • presença de conclusão;

  • repetição excessiva;

  • parágrafos muito longos;

  • densidade de palavras-chave;

  • excesso de caixa alta;

  • excesso de negrito;

  • excesso de emojis.

Exemplo:

const tituloCurto = titulo.length < 20;
const tituloLongo = titulo.length > 70;
const conteudoCurto = palavras < 300;

Essas regras não devem ser tratadas como leis universais.

Um post curto pode ser perfeitamente válido.

O scanner apenas sinaliza.

A decisão continua sendo humana.


O Índice Técnico de SEO

O Blog Doctor pode calcular uma pontuação de zero a cem.

Exemplo inicial:

Título.........................10
Conteúdo.......................15
Headings.......................10
Imagens........................10
Links internos.................10
Marcadores.....................10
HTML limpo.....................15
Acessibilidade.................10
Estrutura......................10

O algoritmo pode começar com 100 pontos e aplicar penalidades.

function calcularSEO(post) {
  let score = 100;

  if (post.titulo.length < 20) {
    score -= 7;
  }

  if (post.palavras < 300) {
    score -= 15;
  }

  if (post.imagensSemAlt > 0) {
    score -= Math.min(12, post.imagensSemAlt * 3);
  }

  if (post.semLinksInternos) {
    score -= 8;
  }

  if (post.residuoIA) {
    score -= 6;
  }

  return Math.max(0, score);
}

Esse índice não mede posição no Google.

Ele mede qualidade técnica estimada.

É semelhante a uma métrica de saúde.

Um servidor pode estar funcionando e ainda apresentar alertas.

Um artigo pode estar indexado e ainda possuir problemas técnicos.


Gravidade e Prioridade

Nem todo problema merece a mesma atenção.

O Blog Doctor deve separar gravidade de prioridade.

Gravidade

Refere-se ao impacto técnico.

BAIXA
MÉDIA
ALTA
CRÍTICA

Prioridade

Refere-se à ordem de correção.

Um problema tecnicamente médio pode ter prioridade alta se aparecer em centenas de posts.

Exemplo:

Problema........Imagem sem ALT
Gravidade.......Média
Ocorrências.....1.240
Prioridade......Alta

Outro exemplo:

Problema........Resíduo data-message-id
Gravidade.......Baixa
Ocorrências.....3
Prioridade......Baixa

Essa distinção evita pânico.


A Matriz de Risco

Podemos criar uma matriz simples.

                 POUCOS POSTS   MUITOS POSTS

BAIXO IMPACTO       BAIXA          MÉDIA
MÉDIO IMPACTO       MÉDIA          ALTA
ALTO IMPACTO        ALTA           CRÍTICA

Em JavaScript:

function calcularPrioridade(gravidade, ocorrencias) {
  const peso = {
    baixa: 1,
    media: 2,
    alta: 3,
    critica: 4
  };

  const volume =
    ocorrencias > 500 ? 3 :
    ocorrencias > 50 ? 2 : 1;

  const resultado = peso[gravidade] + volume;

  if (resultado >= 6) return "crítica";
  if (resultado >= 5) return "alta";
  if (resultado >= 3) return "média";
  return "baixa";
}

Geração de Relatórios

Uma ferramenta sem relatório é apenas um conjunto de funções.

O Blog Doctor precisa transformar dados técnicos em informação útil.

Ele pode produzir quatro tipos de saída.

Dashboard

Indicadores visuais:

Posts analisados.............4.018
HTML saudável................3.912
Posts com alerta................89
Posts críticos..................17
SEO técnico médio..............92
Imagens sem ALT................243
Links HTTP......................81
Resíduos de IA..................14

Relatório por artigo

TÍTULO: Data Division sem Mistérios

URL: https://...

PALAVRAS..................1.846
IMAGENS.......................4
LINKS INTERNOS................3
MARCADORES....................8

SEO TÉCNICO..................94

ALERTAS:
- 1 imagem sem ALT
- 1 link HTTP

CSV

O CSV permite abrir os resultados no Excel ou LibreOffice.

Colunas possíveis:

Título
URL
Data
Palavras
Caracteres
Marcadores
Imagens
Imagens sem ALT
Links internos
Resíduos IA
Resíduos Word
SEO Score
Prioridade

JSON

O JSON é ideal para integração futura.

{
  "blog": "Bellacosa Mainframe",
  "dataAuditoria": "2026-07-26",
  "posts": [
    {
      "titulo": "ABEND sem Mistérios",
      "score": 92,
      "prioridade": "media",
      "ocorrencias": []
    }
  ]
}

A Tela de Progresso

Em um blog com milhares de posts, o usuário precisa saber que o sistema continua funcionando.

Carregando lote 12...

Posts recebidos........1.200
Posts analisados.......1.175
Palavras processadas...1.832.411

[██████████░░░░░░░░░░] 29%

Essa barra não é apenas estética.

Ela reduz a ansiedade e ajuda a identificar travamentos.

Em sistemas batch, o equivalente seria acompanhar o job no SDSF.


Cache e IndexedDB

Reanalisar quatro mil posts em toda visita é desperdício.

O navegador pode guardar os resultados localmente usando IndexedDB.

Arquitetura:

Primeira execução
Feed → análise → IndexedDB

Próxima execução
IndexedDB → dashboard

Atualização
Buscar apenas posts recentes

Isso transforma o painel em uma aplicação muito mais rápida.


Processamento Incremental

Em vez de reler o blog inteiro, podemos guardar a data da última análise.

{
  ultimaAtualizacao: "2026-07-26T23:10:00-03:00"
}

Na próxima execução, o sistema procura apenas artigos publicados ou atualizados depois dessa data.

É o equivalente editorial de um processamento incremental.

Muito semelhante a um batch que lê apenas os registros alterados.


Web Workers

Analisar milhões de palavras pode travar a interface.

Uma solução futura é usar Web Workers.

O Worker executa o processamento em uma thread separada.

const worker = new Worker("blog-doctor-worker.js");

worker.postMessage(posts);

worker.onmessage = evento => {
  atualizarDashboard(evento.data);
};

Assim, a interface continua respondendo enquanto a análise ocorre.


A Implementação Mínima

Uma primeira versão funcional do Blog Doctor precisa apenas de cinco componentes.

1. Leitor do Feed
2. Normalizador
3. Scanner de HTML
4. Calculador de Score
5. Gerador de tabela

Fluxo:

async function executarAuditoria() {
  const entradas = await carregarTodosOsPosts();

  const posts = entradas.map(normalizarPost);

  const auditados = posts.map(post => {
    const ocorrencias = analisarPost(post);
    const score = calcularScore(post, ocorrencias);

    return {
      ...post,
      ocorrencias,
      score
    };
  });

  gerarRelatorio(auditados);
}

Essa função representa o coração do sistema.


Estrutura de uma Ocorrência

Todas as regras devem produzir o mesmo formato.

{
  codigo: "IMG-ALT-MISSING",
  categoria: "Acessibilidade",
  gravidade: "media",
  quantidade: 2,
  mensagem: "Duas imagens não possuem texto alternativo",
  recomendacao: "Adicionar ALT descritivo"
}

Essa padronização torna possível:

  • ordenar;

  • filtrar;

  • exportar;

  • calcular score;

  • gerar relatórios;

  • criar gráficos.


Criando um Catálogo de Regras

As regras podem ficar em uma lista.

const regras = [
  {
    codigo: "HTML-AI-RESIDUE",
    categoria: "HTML",
    gravidade: "baixa",
    testar(post) {
      return /data-message-id/i.test(post.html);
    },
    mensagem: "Resíduo de interface de IA encontrado"
  },
  {
    codigo: "IMG-ALT-MISSING",
    categoria: "Acessibilidade",
    gravidade: "media",
    testar(post) {
      return post.imagensSemAlt > 0;
    },
    mensagem: "Imagem sem ALT"
  }
];

Depois, o motor executa todas.

function executarRegras(post) {
  return regras
    .filter(regra => regra.testar(post))
    .map(regra => ({
      codigo: regra.codigo,
      categoria: regra.categoria,
      gravidade: regra.gravidade,
      mensagem: regra.mensagem
    }));
}

Essa arquitetura facilita adicionar novas verificações sem alterar o restante do programa.


O Equivalente ao Return Code

No mainframe, um job pode terminar com:

RC=0000
RC=0004
RC=0008
RC=0012
RC=0016

O Blog Doctor pode adotar uma lógica semelhante.

BDC0000 – Post saudável
BDC0004 – Alerta leve
BDC0008 – Revisão recomendada
BDC0012 – Problema grave
BDC0016 – Conteúdo crítico

Exemplo:

BDC0008
Imagem sem ALT e heading inconsistente

Isso adiciona identidade à ferramenta e facilita a leitura dos relatórios.


Mensagens no Estilo Mainframe

A ferramenta pode gerar mensagens padronizadas.

BBDHTML001W TABLE FOUND INSIDE PARAGRAPH
BBDSEO004W INTERNAL LINK NOT FOUND
BBDACC002E IMAGE WITHOUT ALT ATTRIBUTE
BBDIA001I AI INTERFACE METADATA DETECTED
BBDDOC003W MICROSOFT WORD RESIDUE FOUND

Legenda:

I – Information
W – Warning
E – Error
S – Severe

Além de divertido, isso cria consistência.


O Dashboard Final

Imagine a tela principal.

┌─────────────────────────────────────────┐
│ BELLA COSA BLOG DOCTOR                  │
│ BLOG HEALTH MONITOR                     │
├─────────────────────────────────────────┤
│ Posts.........................4.018     │
│ Score médio.....................94      │
│ Alertas.........................126     │
│ Críticos.........................12     │
├─────────────────────────────────────────┤
│ HTML   ████████████████ 96              │
│ SEO    ███████████████  92              │
│ A11Y   ██████████████   88              │
│ LINKS  ███████████████  91              │
└─────────────────────────────────────────┘

Abas:

  • visão geral;

  • HTML;

  • SEO;

  • acessibilidade;

  • imagens;

  • links;

  • resíduos;

  • posts;

  • exportação.


O Que Não Deve Ser Automatizado

Uma ferramenta madura também precisa saber seus limites.

O Blog Doctor não deve:

  • reescrever automaticamente milhares de posts;

  • remover tags sem confirmação;

  • alterar URLs;

  • trocar títulos;

  • apagar marcadores;

  • corrigir links externos de forma cega;

  • publicar alterações sem backup.

Ele deve diagnosticar.

A correção pode ser manual ou assistida.

Mas sempre controlada.


Auditoria Não é Limpeza

Essa distinção é fundamental.

AUDITORIA
Descobre e classifica

LIMPEZA
Altera o conteúdo

Misturar as duas etapas é perigoso.

No mainframe, primeiro analisamos o dump.

Depois corrigimos o programa.

Não alteramos a memória do dump esperando que o sistema volte a funcionar.


O Bellacosa Blog Doctor como Projeto Real

O projeto pode evoluir em versões.

Versão 0.1

  • leitura de 100 posts;

  • contagem de palavras;

  • posts por ano.

Versão 0.5

  • paginação completa;

  • imagens;

  • links;

  • headings.

Versão 1.0

  • scanner HTML;

  • scanner SEO;

  • dashboard;

  • CSV.

Versão 2.0

  • IndexedDB;

  • processamento incremental;

  • mapa de calor;

  • evolução dos marcadores.

Versão 3.0

  • Web Workers;

  • auditoria remota de links;

  • relatórios JSON;

  • comparação entre auditorias.

Versão 4.0

  • sugestões de correção;

  • diff de HTML;

  • histórico de qualidade;

  • integração com Search Console.


Comparando Auditorias

Uma das funções mais poderosas será comparar dois momentos.

AUDITORIA 1 – JULHO/2026
Score geral.................88
HTML inválido...............49
Imagens sem ALT............312

AUDITORIA 2 – OUTUBRO/2026
Score geral.................94
HTML inválido...............11
Imagens sem ALT.............87

Isso permite medir evolução real.

Não apenas sensação.


O Histórico de Saúde

Cada auditoria pode ser salva.

{
  data: "2026-07-26",
  posts: 4018,
  score: 92,
  problemas: {
    html: 49,
    imagens: 312,
    links: 87
  }
}

Depois criamos um gráfico.

Julho...........88
Agosto..........90
Setembro........92
Outubro.........94

Esse é o verdadeiro conceito de evolução técnica.


O RMF Editorial

No z/OS, o RMF ajuda a observar recursos do sistema.

O Bellacosa Blog Doctor pode ser visto como um RMF editorial.

Em vez de medir:

  • CPU;

  • memória;

  • I/O;

  • canais;

  • dispositivos.

Ele mede:

  • HTML;

  • palavras;

  • imagens;

  • links;

  • headings;

  • marcadores;

  • qualidade;

  • acessibilidade.

O objetivo é o mesmo.

Transformar um sistema invisível em algo observável.


Um Scanner para Décadas de História

Um blog antigo não é apenas um conjunto de páginas.

É um sistema que atravessou:

  • mudanças de layout;

  • troca de editores;

  • novas tecnologias;

  • alterações de SEO;

  • migrações;

  • modismos;

  • ferramentas;

  • plataformas;

  • estilos de escrita.

O Blog Doctor permite enxergar essas camadas.

Um artigo de 2012 pode ter HTML completamente diferente de um artigo de 2026.

E isso não é necessariamente ruim.

É história.

O scanner não serve apenas para encontrar defeitos.

Ele também ajuda a compreender a evolução do acervo.


Conclusão

Construir o Bellacosa Blog Doctor significa aplicar ao universo editorial os mesmos princípios que tornaram o IBM Mainframe uma das plataformas mais confiáveis da história da computação.

Observabilidade.

Padronização.

Diagnóstico.

Controle.

Mensuração.

Rastreabilidade.

A ferramenta começa lendo um simples Feed Atom.

Depois converte cada post em uma estrutura organizada.

Em seguida executa algoritmos de análise.

Detecta resíduos.

Avalia HTML.

Examina imagens.

Verifica headings.

Conta palavras.

Classifica problemas.

Calcula scores.

Gera relatórios.

E transforma milhares de páginas dispersas em um sistema mensurável.

Essa talvez seja a maior evolução de toda a série.

No início queríamos apenas descobrir algumas tags invisíveis.

Agora estamos projetando uma plataforma de auditoria capaz de examinar décadas de produção digital.

O Feed Atom deixou de ser apenas um arquivo XML.

Virou dump.

Virou log.

Virou histórico.

Virou matéria-prima para inteligência editorial.

E o Bellacosa Blog Doctor deixa de ser apenas uma ideia curiosa.

Ele se transforma em uma ferramenta de engenharia.

Uma ferramenta que não promete milagres.

Não apaga tudo automaticamente.

Não substitui o julgamento humano.

Mas faz aquilo que as melhores ferramentas de diagnóstico sempre fizeram:

mostra a verdade antes que alguém toque em produção.

Porque, seja em um Data Center IBM ou em um blog com milhares de artigos, a regra continua sendo a mesma:

Primeiro diagnostique. Depois corrija. E nunca altere aquilo que você ainda não compreendeu.

🔎 CSI BLOGSPOT · ARQUIVO DE EVIDÊNCIAS

Blog Analytics: A Investigação Completa

Seis capítulos sobre auditoria de HTML, resíduos invisíveis, limpeza segura, checklist técnico e construção do Bellacosa Blog Doctor.

6 relatórios2018HTML · SEO · Blogger
CASE FILE 01

Blog Analytics — Parte I

Como descobrir evidências invisíveis no HTML de um blog antigo.

HTMLAuditoriaBlogspot
CASE FILE 02

Blog Analytics — Parte II

Os resíduos invisíveis deixados por editores, Word, IA e cópias antigas.

ResíduosWord HTMLIA
CASE FILE 03

Blog Analytics — Parte III

Como limpar milhares de posts sem destruir o acervo editorial.

LimpezaBackupQualidade
CASE FILE 04

Blog Analytics — Parte IV

Checklist de auditoria para blogs antigos e acervos com anos de história.

ChecklistSEO TécnicoAuditoria
CASE FILE 05

Blog Analytics — Parte V

Construindo o Bellacosa Blog Doctor e seu scanner automático.

Blog DoctorScannerJavaScript
CASE FILE 06

Blog Analytics — Parte VI

Criando o motor de regras, scores, prioridades e códigos de retorno.

Motor de RegrasScoreMainframe

Índice textual da série Blog Analytics

Esta série investiga a saúde técnica de blogs antigos no Blogger, cobrindo auditoria de HTML, resíduos de editores, SEO técnico, acessibilidade, limpeza segura, diagnóstico automatizado e motores de regras.

  1. Blog Analytics Parte I — Como descobrir evidências invisíveis
  2. Blog Analytics Parte II — Os resíduos invisíveis do HTML
  3. Blog Analytics Parte III — Como limpar com segurança
  4. Blog Analytics Parte IV — Checklist de auditoria
  5. Blog Analytics Parte V — Construindo o Bellacosa Blog Doctor
  6. Blog Analytics Parte VI — Criando o motor de regras

terça-feira, 19 de junho de 2018

API Status Codes : Quando um Programador Descobre que o Servidor Já Respondeu à Pergunta… Mas Ele Preferiu Consultar Três Logs, Dois Oráculos e um Monge no Deserto

 

Bellacosa Mainframe e o status codes das api numa visão para pequenos gafanhotos

☕ Um Café no Bellacosa Mainframe

API Status Codes sem Mistérios para Programadores COBOL

Quando um Programador Descobre que o Servidor Já Respondeu à Pergunta… Mas Ele Preferiu Consultar Três Logs, Dois Oráculos e um Monge no Deserto

No início da jornada, o jovem programador acreditava que todo erro de API era uma entidade sobrenatural.

Uma criatura invisível.

Um espírito maligno vivendo entre o frontend, o backend, o banco de dados, o firewall, o proxy reverso, o balanceador de carga e aquele serviço terceirizado que ninguém sabia exatamente quem havia contratado.

Quando a aplicação falhava, ele fazia o ritual tradicional:

  1. Reiniciava o navegador.

  2. Limpava o cache.

  3. Reiniciava a aplicação.

  4. Reiniciava o computador.

  5. Culpava a rede.

  6. Culpava o banco de dados.

  7. Culpava o COBOL.

  8. Perguntava à inteligência artificial.

  9. Mandava uma mensagem no grupo da equipe dizendo:
    “Alguém mexeu em produção?”

Então, numa tarde coberta de névoa, enquanto o vento atravessava os corredores do data center e os discos do mainframe giravam como tambores de um templo tecnológico, apareceu o velho mestre.

Ele vestia um quimono gasto, carregava uma caneca de café e segurava nas mãos uma folha contendo quatro símbolos:

2xx
3xx
4xx
5xx

O jovem programador perguntou:

— Mestre, qual é o significado desses números?

O velho respondeu:

— Pequeno gafanhoto, antes de procurar o erro no universo inteiro, leia aquilo que o servidor já lhe disse.

O programador olhou para a tela.

HTTP/1.1 404 Not Found

— Mestre, devo verificar o banco de dados?

— Não.

— O servidor Java?

— Não.

— A aplicação COBOL?

— Não.

— A temperatura da sala do data center?

— Também não.

— Então o que devo verificar?

O mestre tomou um gole de café.

— A URL.

E assim começou a verdadeira arte marcial do debugging de APIs.


O servidor não fala em enigmas

Quando uma API responde, ela não entrega somente dados.

Ela entrega uma estrutura.

Normalmente, uma resposta HTTP possui pelo menos três elementos importantes:

Status
Headers
Body

Por exemplo:

HTTP/1.1 404 Not Found
Content-Type: application/json
X-Correlation-ID: 9812-A7B3

{
  "error": "Cliente não encontrado"
}

O programador iniciante frequentemente olha apenas para o corpo.

O mais apressado olha apenas para a mensagem.

O mais desesperado ignora tudo e abre os logs.

Mas o verdadeiro praticante da arte do debugging observa o conjunto.

O código 404 indica uma classe de problema.

O corpo informa um detalhe.

O cabeçalho X-Correlation-ID pode permitir encontrar a requisição nos logs.

É semelhante a analisar um ABEND em ambiente mainframe.

Receber apenas:

JOB FAILED

não é suficiente.

Você precisa saber:

Qual step?
Qual programa?
Qual return code?
Qual ABEND?
Qual dataset?
Qual mensagem?
Qual horário?
Qual execução?

Em APIs, o status HTTP é como o primeiro código do incidente.

Ele não resolve tudo, mas mostra em qual porta você deve bater.


O caminho completo de uma chamada de API

Muitos desenvolvedores imaginam uma API desta maneira:

Cliente → Servidor

Parece simples.

Quase poético.

Infelizmente, sistemas corporativos raramente possuem a delicadeza de um poema.

O caminho real pode ser:

Aplicação cliente
        ↓
DNS
        ↓
Proxy corporativo
        ↓
Firewall
        ↓
WAF
        ↓
CDN
        ↓
Load balancer
        ↓
API Gateway
        ↓
Servidor web
        ↓
Aplicação
        ↓
Banco de dados
        ↓
Fila
        ↓
Mainframe
        ↓
Outro serviço externo

Quando você recebe um erro, ele pode ter sido produzido por qualquer ponto dessa longa peregrinação.

Um 502, por exemplo, geralmente indica que algum intermediário tentou conversar com outro servidor e recebeu uma resposta inválida.

Um 504 indica que o intermediário esperou, esperou, acendeu uma vela, terminou um café e desistiu.

Um 401 pode ser produzido por um gateway de autenticação antes mesmo de a requisição chegar à aplicação.

Portanto, aprender os códigos HTTP é aprender a localizar o templo onde o problema provavelmente vive.


A primeira família: 1xx — o mensageiro ainda está falando

Os códigos 1xx são pouco vistos no desenvolvimento cotidiano, mas fazem parte do protocolo.

Eles indicam que alguma informação preliminar foi transmitida e que o processo continua.

100 Continue

Imagine que você pretende enviar um arquivo gigantesco para o servidor.

Antes de enviar tudo, o cliente pode perguntar:

Expect: 100-continue

O servidor responde:

HTTP/1.1 100 Continue

Em outras palavras:

“Pode continuar. Ainda não rejeitei sua requisição.”

Isso evita que o cliente envie centenas de megabytes apenas para descobrir depois que não possui autorização.

É como chegar ao portão do mosteiro com vinte caixas e perguntar:

— Posso entrar?

O porteiro responde:

— Continue.

Melhor isso do que carregar tudo até o pátio e descobrir que o templo estava fechado desde 1978.

101 Switching Protocols

Esse código indica mudança de protocolo.

A conexão começou de uma forma e continuará de outra.

É comum em situações de upgrade de comunicação.

103 Early Hints

Permite que o servidor envie pistas antecipadas para o cliente começar a preparar certos recursos antes da resposta final.

É uma espécie de mensagem do mestre:

“Ainda não terminei a explicação, mas já vá abrindo o manual.”


A segunda família: 2xx — a técnica foi executada com sucesso

Os códigos 2xx indicam sucesso sob a ótica do protocolo HTTP.

Mas existe uma diferença importante:

Sucesso HTTP não significa necessariamente sucesso de negócio.

Uma API pode responder 200 OK e, dentro do corpo, informar que uma operação comercial falhou.

Isso é possível, embora frequentemente represente uma API mal projetada.


200 OK

É o sucesso genérico.

Exemplo:

GET /clientes/123

Resposta:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 123,
  "nome": "Vagner",
  "status": "ativo"
}

A requisição foi atendida e o recurso foi retornado.

No mundo COBOL, seria algo semelhante a:

Programa executado
Registro encontrado
Dados retornados
RETURN-CODE = 0

Mas tome cuidado com respostas como:

HTTP/1.1 200 OK

{
  "success": false,
  "message": "Cliente não encontrado"
}

O protocolo diz sucesso.

O corpo diz falha.

É como um job terminar com CC 0000 e imprimir no relatório:

NENHUM REGISTRO FOI PROCESSADO PORQUE O ARQUIVO ESTAVA CORROMPIDO

Tecnicamente terminou.

Funcionalmente, o castelo está em chamas.

A primeira lição é:

Sempre valide o conteúdo da resposta, não apenas o código.


201 Created

O código 201 indica que um novo recurso foi criado.

Requisição:

POST /clientes
Content-Type: application/json

{
  "nome": "Maria",
  "email": "maria@example.com"
}

Resposta:

HTTP/1.1 201 Created
Location: /clientes/845

{
  "id": 845,
  "nome": "Maria",
  "email": "maria@example.com"
}

O cabeçalho Location informa onde o novo recurso pode ser encontrado.

Analogia mainframe:

200 = a consulta funcionou
201 = um novo registro foi gravado

É como executar um WRITE com sucesso em um arquivo VSAM e receber a chave do registro recém-criado.


202 Accepted

Este é um dos códigos mais importantes para quem conhece processamento batch.

O 202 significa:

“Recebi sua solicitação, aceitei o trabalho, mas ele ainda não terminou.”

Exemplo:

POST /relatorios/mensais

Resposta:

HTTP/1.1 202 Accepted
Location: /tarefas/98271

{
  "taskId": 98271,
  "status": "PROCESSING"
}

Isto é praticamente o equivalente web de:

JOB SUBMITTED

Submeter o job não significa que ele terminou.

Ele pode estar:

INPUT
EXECUTION
OUTPUT
HELD
ABENDED

O iniciante vê 202 e comemora.

O mestre pergunta:

— Onde você consulta o resultado?

O 202 normalmente deve ser acompanhado por algum mecanismo de acompanhamento:

GET /tarefas/98271

Resposta posterior:

{
  "taskId": 98271,
  "status": "COMPLETED"
}

Ou, em um dia menos agradável:

{
  "taskId": 98271,
  "status": "FAILED",
  "error": "Database unavailable"
}

204 No Content

O 204 significa sucesso sem corpo de resposta.

Exemplo:

DELETE /clientes/845

Resposta:

HTTP/1.1 204 No Content

A operação funcionou.

Não existe JSON.

Não existe XML.

Não existe mensagem de parabéns.

O servidor apenas cruza os braços e diz:

“Feito.”

Isso provoca um erro clássico em JavaScript:

const data = await response.json();

Se a resposta é 204, não existe JSON.

Então o cliente pode falhar tentando ler algo que nunca foi enviado.

Forma mais segura:

if (response.status === 204) {
  return null;
}

return await response.json();

O programador COBOL compreenderá imediatamente.

É como um programa que termina com RETURN-CODE = 0, mas não gera relatório porque não havia nada a imprimir.


A terceira família: 3xx — o caminho mudou

Os códigos 3xx indicam redirecionamento, reutilização de cache ou mudança de localização.

O servidor não está necessariamente dizendo que existe um erro.

Ele pode estar dizendo:

“Aquilo que você procura está em outro lugar.”


301 Moved Permanently

O recurso mudou definitivamente.

Exemplo:

GET /api/v1/clientes

Resposta:

HTTP/1.1 301 Moved Permanently
Location: /api/v2/clientes

A antiga rota foi substituída.

Isso pode ocorrer por:

  • mudança de domínio;

  • migração para HTTPS;

  • nova versão da API;

  • reestruturação de endpoints;

  • alteração permanente de endereço.

O erro aparece quando o cliente não segue redirecionamentos automaticamente.

O navegador geralmente segue.

Uma aplicação antiga talvez não.

Um programa batch escrito quando televisores ainda possuíam madeira nas laterais pode simplesmente receber o 301 e ficar olhando para ele como um discípulo diante de uma porta fechada.


302 Found

O 302 representa normalmente um redirecionamento temporário.

Um caso comum é autenticação.

Você chama:

GET /api/clientes

O servidor responde:

HTTP/1.1 302 Found
Location: /login

O navegador segue o redirecionamento e recebe:

HTTP/1.1 200 OK
Content-Type: text/html

Então o desenvolvedor reclama:

“A API está retornando HTML em vez de JSON!”

Na realidade, a API redirecionou para a página de login, e o cliente seguiu automaticamente.

A sequência real foi:

GET /api/clientes
        ↓
302 /login
        ↓
200 página HTML

Por isso, ferramentas como curl ajudam muito.

curl -v https://api.exemplo.com/clientes

O modo verboso revela os passos intermediários.


304 Not Modified

O 304 está relacionado a cache.

Ele significa:

“O conteúdo não mudou. Use a cópia que você já possui.”

Primeira requisição:

GET /imagem.png

Resposta:

HTTP/1.1 200 OK
ETag: "abc123"

Requisição posterior:

GET /imagem.png
If-None-Match: "abc123"

Resposta:

HTTP/1.1 304 Not Modified

O servidor não envia novamente o arquivo.

O navegador usa a versão em cache.

Isso economiza:

  • banda;

  • tempo;

  • processamento;

  • custo;

  • tráfego.

Mas também pode criar o famoso bug fantasma:

“Eu alterei o JavaScript, mas o navegador insiste em executar a versão antiga.”

Nesse momento, o culpado pode ser:

Cache-Control
ETag
CDN
Proxy
Service Worker
Cache do navegador

O jovem programador apaga a aplicação inteira.

O mestre apenas pressiona Ctrl + Shift + R.


A quarta família: 4xx — a requisição chegou com problemas

Os códigos 4xx indicam que existe algum impedimento associado à requisição do cliente.

Isso não significa que o frontend é culpado.

Pode haver documentação errada, configurações incorretas, permissões mal atribuídas ou contratos incompatíveis.

O código apenas indica onde começar.


400 Bad Request

O 400 significa requisição inválida.

Possíveis causas:

  • JSON malformado;

  • parâmetro incorreto;

  • data em formato inválido;

  • cabeçalho errado;

  • corpo incompleto;

  • tipo de conteúdo incompatível.

Exemplo:

{
  "nome": "Vagner",
  "idade": 52,
}

A vírgula final pode tornar o JSON inválido.

Outro exemplo:

Content-Type: text/plain

quando a API espera:

Content-Type: application/json

Analogia COBOL:

05 WS-DATA PIC 9(8).

Entrada recebida:

23/07/2026

O humano compreende.

O programa não.

O layout esperava oito dígitos, talvez:

20260723

Quando receber 400, verifique:

Método
URL
Query string
Headers
Content-Type
JSON
Tipos
Datas
Campos obrigatórios
Codificação

401 Unauthorized

O 401 indica problema de autenticação.

Tradução prática:

“Não consegui validar corretamente quem você é.”

Causas comuns:

  • token ausente;

  • token expirado;

  • token inválido;

  • chave de API incorreta;

  • assinatura inválida;

  • usuário inexistente;

  • relógio fora de sincronia.

Exemplo:

Authorization: Bearer token-expirado

Resposta:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer

Uma situação curiosa ocorre com tokens JWT.

O token pode possuir:

Data de emissão
Data de expiração
Emissor
Audiência
Escopos
Assinatura

Se o relógio da máquina cliente estiver alguns minutos errado, um token válido pode parecer expirado ou ainda não válido.

Às vezes o grande vilão da autenticação não é um hacker internacional.

É o relógio do servidor.


403 Forbidden

O 403 significa que a identidade pode ser conhecida, mas a operação não é permitida.

Diferença essencial:

401 = não consegui autenticar você
403 = autentiquei você, mas você não possui autorização

Exemplo:

Usuário: Vagner
Perfil: CONSULTA
Operação: DELETE

Resposta:

HTTP/1.1 403 Forbidden

No mundo mainframe, pense em RACF:

Usuário reconhecido
Senha aceita
Acesso ao recurso negado

Você entrou no prédio.

Possui crachá.

Mas a porta da sala de produção continua fechada.

E o segurança não parece disposto a discutir filosofia.


404 Not Found

O 404 significa que a rota ou o recurso não foi encontrado.

Pode ser:

URL errada
Endpoint inexistente
ID inexistente
Versão incorreta
Ambiente errado
Deploy incompleto
Maiúscula ou minúscula diferente
Context path ausente

Exemplo:

GET /clientes/999999

Resposta:

HTTP/1.1 404 Not Found

Existem duas situações diferentes.

A rota não existe

/api/clientez/123

O endpoint foi digitado incorretamente.

O recurso não existe

/api/clientes/999999

O endpoint existe, mas o cliente não.

Outra armadilha:

O endpoint existe em desenvolvimento:

/api/v2/clientes

Mas produção só possui:

/api/v1/clientes

O código está no repositório.

O pipeline ficou verde.

A apresentação para a diretoria foi magnífica.

O endpoint, entretanto, não foi implantado.

O 404 está apenas dizendo:

“Aqui, neste ambiente, nesta rota, isso não existe.”


405 Method Not Allowed

A rota existe, mas o método HTTP não é permitido.

Exemplo:

POST /clientes/123

Resposta:

HTTP/1.1 405 Method Not Allowed
Allow: GET, PUT, DELETE

Diferença:

404 = não encontrei a rota ou o recurso
405 = encontrei a rota, mas esse verbo não é aceito

É como chegar à agência correta, falar com a pessoa correta e pedir a operação errada.


409 Conflict

O 409 indica conflito com o estado atual do recurso.

Exemplos:

  • usuário duplicado;

  • e-mail já cadastrado;

  • versão antiga do registro;

  • assento já reservado;

  • pedido já processado;

  • recurso sendo alterado por outro processo.

Imagine:

Cliente A lê:

{
  "id": 100,
  "saldo": 500,
  "versao": 7
}

Cliente B altera o registro.

Agora a versão é 8.

Cliente A tenta salvar usando a versão 7.

Resposta:

HTTP/1.1 409 Conflict

A requisição é válida.

O problema é que ela nasceu em um passado que já não existe.

É praticamente uma viagem no tempo corporativa.


415 Unsupported Media Type

O formato enviado não é aceito.

Você envia:

Content-Type: application/xml

Mas a API aceita apenas:

Content-Type: application/json

Resposta:

HTTP/1.1 415 Unsupported Media Type

Antes de investigar o banco de dados, examine o cabeçalho.

Muitos incidentes terminam com uma frase humilhante:

“Estávamos enviando XML para um endpoint JSON.”


422 Unprocessable Content

O JSON está bem formado, mas os dados não passam nas regras.

Exemplo:

{
  "nome": "Ana",
  "idade": -17,
  "email": "banana"
}

A sintaxe é válida.

Os valores não são.

Resposta:

HTTP/1.1 422 Unprocessable Content

{
  "errors": [
    {
      "field": "idade",
      "message": "Valor inválido"
    },
    {
      "field": "email",
      "message": "Formato inválido"
    }
  ]
}

Distinção prática:

400 = não consegui interpretar corretamente
422 = interpretei, mas não posso aceitar

Nem todas as APIs seguem essa divisão, mas ela é útil.


429 Too Many Requests

O cliente ultrapassou o limite de requisições.

Resposta:

HTTP/1.1 429 Too Many Requests
Retry-After: 60

Tradução:

“Pare por sessenta segundos.”

O cliente mal projetado interpreta:

“Tente imediatamente mais quinhentas vezes.”

E assim nasce um pequeno ataque de negação de serviço produzido pela própria aplicação.

A solução correta inclui:

  • respeitar Retry-After;

  • usar backoff exponencial;

  • adicionar jitter;

  • reduzir concorrência;

  • usar cache;

  • evitar polling excessivo.

Exemplo:

1ª falha → espera 1 segundo
2ª falha → espera 2 segundos
3ª falha → espera 4 segundos
4ª falha → espera 8 segundos

Com jitter, adiciona-se um pequeno intervalo aleatório.

Isso evita que milhares de clientes voltem exatamente ao mesmo tempo, como discípulos famintos quando alguém anuncia que o café está pronto.


A quinta família: 5xx — o servidor tropeçou

Os códigos 5xx indicam falha do lado servidor ou de alguma infraestrutura associada.

Mas cuidado:

Uma requisição específica pode acionar um bug do servidor.

O cliente pode ser o gatilho, embora a responsabilidade técnica continue sendo da aplicação.


500 Internal Server Error

É o erro genérico.

Pode representar:

  • exceção não tratada;

  • variável nula;

  • banco indisponível;

  • configuração incorreta;

  • falha de serialização;

  • falta de memória;

  • arquivo ausente;

  • erro de programação;

  • dependência indisponível.

Resposta ruim:

HTTP/1.1 500 Internal Server Error

Something went wrong

Resposta melhor:

HTTP/1.1 500 Internal Server Error
X-Correlation-ID: A7C9-2218

{
  "status": 500,
  "message": "Não foi possível concluir a operação",
  "correlationId": "A7C9-2218"
}

O correlation ID é extremamente importante.

Ele permite localizar a mesma transação nos logs de:

Gateway
Aplicação
Banco
Fila
Mainframe
Serviço externo

O usuário não deve receber stack trace, senha, SQL completo ou detalhes internos.

Isso seria como imprimir o conteúdo do dump de produção na porta da empresa.


502 Bad Gateway

Um gateway ou proxy recebeu uma resposta inválida do servidor posterior.

Fluxo:

Cliente
   ↓
Gateway
   ↓
Backend

O gateway está ativo.

O backend falhou, respondeu de forma inválida ou não aceitou a conexão.

Causas:

  • serviço caiu;

  • DNS interno falhou;

  • porta errada;

  • certificado inválido;

  • container reiniciando;

  • conexão recusada;

  • resposta malformada.

Tradução kung fu:

O mensageiro chegou ao portão, mas o mestre do templo não respondeu corretamente.


503 Service Unavailable

O serviço está temporariamente indisponível.

Possíveis causas:

  • manutenção;

  • sobrecarga;

  • nenhuma instância saudável;

  • aplicação iniciando;

  • pool de conexões esgotado;

  • circuit breaker aberto;

  • banco fora do ar.

Resposta:

HTTP/1.1 503 Service Unavailable
Retry-After: 120

Diferença:

500 = ocorreu uma falha interna inesperada
503 = o serviço não consegue atender agora

Em ambiente com containers, um 503 pode significar:

Load balancer funcionando
Nenhum pod saudável disponível

O restaurante está aberto.

A cozinha desapareceu.


504 Gateway Timeout

O gateway esperou pelo backend, mas o tempo limite expirou.

Fluxo:

Cliente
   ↓
Gateway
   ↓
API
   ↓
Banco
   ↓
Mainframe

O gateway espera 30 segundos.

O backend demora 45.

Resultado:

HTTP/1.1 504 Gateway Timeout

O detalhe mais valioso pode ser o tempo.

Se o erro ocorre sempre em exatamente 30 segundos, existe grande chance de um timeout configurado nessa camada.

Por exemplo:

Gateway timeout: 30 s
API timeout: 60 s
Banco responde em 42 s

A aplicação ainda trabalha quando o gateway abandona a conversa.

A solução não é automaticamente aumentar o timeout.

Talvez seja melhor:

  • otimizar SQL;

  • criar processamento assíncrono;

  • devolver 202;

  • usar fila;

  • paginar;

  • criar cache;

  • dividir o trabalho.

Aumentar o timeout sem investigar é como ensinar o discípulo a esperar mais tempo diante de uma porta emperrada.


O perigo dos retries

Nem toda chamada deve ser repetida.

Métodos normalmente idempotentes

GET
PUT
DELETE

Em princípio, repetir deve conduzir ao mesmo estado final.

POST normalmente não é idempotente

Exemplo:

POST /pagamentos

O servidor processa o pagamento.

A resposta demora.

O gateway devolve 504.

O cliente repete.

Resultado possível:

Pagamento 1 criado
Pagamento 2 criado
Cliente furioso
Reunião extraordinária
PowerPoint com 74 slides

Para evitar duplicidade, APIs podem aceitar:

Idempotency-Key: pedido-82719-pagamento-1

Se a mesma operação for repetida, o servidor reconhece a chave.

Retries fazem mais sentido em códigos como:

408
429
502
503
504

Mesmo assim, devem possuir:

  • limite de tentativas;

  • backoff;

  • jitter;

  • controle de duplicidade;

  • respeito ao Retry-After.

Não repita cegamente:

400
401
403
404
409
422

Uma requisição errada repetida cem vezes continua errada.

Ela apenas fica mais barulhenta.


Passo a passo para investigar uma API

Quando surgir um erro, siga esta ordem.

Passo 1 — veja o método

GET
POST
PUT
PATCH
DELETE

A rota pode aceitar apenas alguns métodos.

Passo 2 — confira a URL completa

Verifique:

Protocolo
Domínio
Porta
Context path
Versão
Endpoint
Query string
Barra final
Maiúsculas e minúsculas

Passo 3 — leia o status

Classifique:

1xx → continuação
2xx → sucesso
3xx → redirecionamento ou cache
4xx → problema associado à requisição
5xx → problema no servidor ou infraestrutura

Passo 4 — leia os headers

Especialmente:

Authorization
Content-Type
Accept
Location
Retry-After
ETag
X-Correlation-ID

Passo 5 — leia o corpo

A mensagem pode indicar:

Campo inválido
Token expirado
Recurso ausente
Versão conflitante
Limite excedido

Passo 6 — observe o tempo

Erro em 10 ms → falha imediata
Erro em 30 s exatos → timeout provável
Erro variável → dependência instável

Passo 7 — procure o correlation ID

Use-o nos logs.

Passo 8 — reproduza com ferramenta simples

Exemplo:

curl -v \
  -H "Authorization: Bearer TOKEN" \
  -H "Accept: application/json" \
  https://api.exemplo.com/clientes/123

O curl -v mostra:

  • conexão;

  • certificados;

  • headers enviados;

  • headers recebidos;

  • redirecionamentos;

  • status;

  • detalhes úteis.

Passo 9 — só então abra os logs

Os logs não devem ser o primeiro lugar.

Devem ser o lugar correto após o status indicar a direção.


O algoritmo COBOL do guerreiro HTTP

Um programador COBOL pode pensar desta forma:

EVALUATE TRUE

   WHEN HTTP-STATUS >= 100
    AND HTTP-STATUS < 200
      DISPLAY 'RESPOSTA INFORMATIVA'

   WHEN HTTP-STATUS >= 200
    AND HTTP-STATUS < 300
      DISPLAY 'SUCESSO HTTP'
      PERFORM VALIDAR-RESULTADO-FUNCIONAL

   WHEN HTTP-STATUS >= 300
    AND HTTP-STATUS < 400
      DISPLAY 'VERIFICAR REDIRECT OU CACHE'
      PERFORM ANALISAR-LOCATION

   WHEN HTTP-STATUS >= 400
    AND HTTP-STATUS < 500
      DISPLAY 'VERIFICAR REQUEST'
      PERFORM ANALISAR-AUTH
      PERFORM ANALISAR-HEADERS
      PERFORM ANALISAR-BODY

   WHEN HTTP-STATUS >= 500
    AND HTTP-STATUS < 600
      DISPLAY 'VERIFICAR SERVIDOR'
      PERFORM LOCALIZAR-CORRELATION-ID
      PERFORM CONSULTAR-LOGS

   WHEN OTHER
      DISPLAY 'STATUS INESPERADO'

END-EVALUATE.

Mas o mestre acrescentaria:

IF HTTP-STATUS = 200
   AND BUSINESS-RESULT NOT = 'SUCCESS'
      DISPLAY 'HTTP OK, NEGOCIO NAO OK'
END-IF.

Porque o sábio sabe que nem todo 200 representa felicidade.


Curiosidades do templo HTTP

Curiosidade 1 — 401 possui um nome confuso

401 Unauthorized é usado principalmente para falha de autenticação.

O código mais associado à falta de autorização é 403.

O nome histórico permaneceu, e agora gera confusão em várias gerações de desenvolvedores.

Curiosidade 2 — 404 pode proteger informações

Alguns sistemas devolvem 404 em vez de 403 para não revelar que determinado recurso existe.

Em vez de dizer:

“Existe, mas você não pode acessar.”

o sistema responde:

“Nunca ouvi falar.”

É o equivalente digital do monge que esconde o pergaminho atrás das costas.

Curiosidade 3 — 418 existe como brincadeira

O código 418 I’m a Teapot nasceu como uma piada relacionada a um protocolo fictício de controle de bules de café.

Não deve ser usado como erro sério de produção.

Embora, em certas empresas, talvez descreva com precisão a maturidade da arquitetura.

Curiosidade 4 — 200 pode esconder desastre

Algumas APIs antigas retornam 200 para tudo.

Exemplo:

{
  "status": "ERROR",
  "message": "Database unavailable"
}

Isso dificulta:

  • monitoramento;

  • alertas;

  • métricas;

  • retries;

  • tratamento automático.

O protocolo foi criado para comunicar semântica.

Ignorá-lo é como comprar um painel de instrumentos e cobrir todos os indicadores com fita adesiva.

Curiosidade 5 — o tempo é um código invisível

Um 500 em 5 milissegundos e um 500 em 60 segundos provavelmente possuem causas diferentes.

O tempo de resposta é quase um segundo status.


Easter egg: o mestre e o código 404

Conta-se que um jovem discípulo passou três dias procurando um endpoint.

Ele verificou:

  • banco de dados;

  • certificados;

  • filas;

  • firewall;

  • mainframe;

  • memória;

  • CPU;

  • logs;

  • DNS;

  • fases da lua.

Ao final, o mestre perguntou:

— Qual URL você chamou?

O discípulo respondeu:

/api/v1/cilentes

O mestre permaneceu em silêncio.

O discípulo percebeu a troca de letras.

Perguntou:

— Por que não me avisou antes?

O mestre respondeu:

— Eu avisei.

— Quando?

— No primeiro 404.

Naquela noite, o discípulo aprendeu duas lições:

  1. O servidor fala.

  2. O ego do desenvolvedor nem sempre escuta.


A regra final do Bellacosa Mainframe

Guarde este mapa:

1xx → continue observando
2xx → confirme o resultado
3xx → siga o caminho
4xx → revise a requisição
5xx → investigue o servidor

Depois aprofunde:

Status
+ método
+ URL
+ headers
+ body
+ duração
+ correlation ID
= diagnóstico

O código HTTP não é a solução completa.

Ele é a primeira pista.

Ele não diz necessariamente qual linha falhou, qual tabela travou ou qual container decidiu abandonar esta dimensão.

Mas reduz o universo de possibilidades.

Em vez de perguntar:

“O que pode estar errado em toda a arquitetura?”

você pergunta:

“Por que este cliente recebeu um 401?”

ou:

“Qual upstream provocou este 502?”

ou:

“Por que a chamada sempre termina em 504 após 30 segundos?”

A pergunta fica menor.

A investigação fica objetiva.

O incidente deixa de ser uma lenda oriental contada por desenvolvedores apavorados ao redor de um monitor.

E torna-se engenharia.

No último episódio, o jovem programador recebeu uma nova mensagem:

HTTP/1.1 403 Forbidden

A equipe começou a correr.

Um administrador abriu os logs.

Outro reiniciou o servidor.

Alguém sugeriu aumentar a memória.

Um consultor propôs migrar tudo para Kubernetes.

O jovem permaneceu sentado.

Tomou um gole de café.

Abriu o token.

Verificou os escopos.

Descobriu que o usuário possuía permissão de leitura, mas não de exclusão.

Corrigiu a autorização.

A chamada retornou:

HTTP/1.1 204 No Content

O velho mestre observou de longe e perguntou:

— O que a API disse?

O programador respondeu:

— Nada.

O mestre sorriu.

— Então finalmente funcionou.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...