HTTP, pedidos e Ajax
URLs, mensagens, métodos, estados, cookies, cache, promessas, JSON, fetch, SOP e CORS.
Identificar e ler
- Origem = esquema + host + porta.
httpehttpsno mesmo host são origens distintas. Fragmento#...fica no navegador. - Pedido: método, alvo, versão; cabeçalhos; linha vazia; corpo. Resposta: estado; cabeçalhos; linha vazia; corpo. HTTP/2 e 3 mudam a codificação, não os conceitos.
Acceptpede formato;Content-Typedescreve o corpo enviado.Content-Lengthconta bytes. Formulário:urlencoded; upload:multipart; JSON:application/json. Em PHP, JSON não aparece em$_POST: lê o corpo e descodifica.
Métodos e estados
| Método | Seguro | Idempotente |
|---|---|---|
| GET, HEAD, OPTIONS | Sim | Sim |
| POST | Não | Não, em geral |
| PUT, DELETE | Não | Sim |
| PATCH | Não | Depende da operação |
- Idempotente descreve efeito, não resposta igual: dois DELETE podem dar 204 e depois 404. Dois POST podem criar duas reservas.
GET /apagar?id=7é errado mesmo com método seguro. - REST: recurso no URL, operação no método. JSON sozinho não é REST. Stateless: cada pedido traz o necessário; não proíbe guardar dados no servidor.
- 200 sucesso; 201 criado (
Location); 204 sem corpo; 303 consulta outro destino por GET; 304 cache válida; 400 entrada; 401 credenciais; 403 recusa; 404 ausente; 405 método (Allow); 500 interno.
Sessão, cookies e cache
Set-Cookiena resposta;Cookienos pedidos seguintes. Cookie é entrada do cliente, não prova de permissão.HttpOnlyesconde de JavaScript mas não trava o envio.ETagcomIf-None-Matchpermite 304 sem corpo.no-storeproíbe guardar;no-cacheguarda mas revalida. Nada de respostas privadas em caches partilhadas.
Assíncrono e fetch
console.log('A');
Promise.resolve().then(() => console.log('B'));
console.log('C'); // A, C, B
awaitsuspende só a função; reações correm como microtarefas após o código corrente. Cálculo pesado continua a bloquear.fetchresolve com 404/500: testaresposta.ok(200 a 299) e lança erro.json()é assíncrono; 200 com HTML falha na mesma.- Parâmetros com
URLSearchParams(espaços,&, acentos). Respostas fora de ordem: numera pedidos e só a atual toca na lista.AbortControllercancela, não dispensa a comparação. - JSON: aspas duplas, sem comentários nem vírgula final.
stringifycodifica,parsedescodifica, nuncaeval.
Entre origens
- SOP limita leitura por scripts, não todos os envios. CORS autoriza leitura; não autentica nem impede CSRF.
- GET simples pode dispensar preflight; POST com
application/jsonexige-o normalmente. OPTIONS levaOrigin, método e cabeçalhos; a resposta autoriza cada um, e a resposta real repeteAccess-Control-Allow-Origin. - Falha de CORS na leitura não anula alteração já feita no servidor.
- Credenciais:
credentials: 'include', origem concreta (nunca*) eAccess-Control-Allow-Credentials.mode: 'no-cors'dá resposta opaca, ilegível.
Arquiteturas
- MPA navega entre documentos; SPA atualiza no cliente (mantém URLs, histórico, acesso). SSR gera HTML no servidor; CSR gera no cliente. Eixos independentes.
localStoragepersiste por origem;sessionStoragepor separador e sessão. Não seguem em pedidos; nada de segredos.- Service worker interceta pedidos das páginas que controla; não corre dentro dos eventos do DOM.