PUT em API REST
- Entrada
- PUT /items/1, Content-Type: application/json
- Saída esperada
- OPTIONS enviado antes, checando Allow-Methods
O servidor precisa responder ao preflight, não só ao PUT.
preflight OPTIONS para PUT e JSON
Um simples PUT para atualizar um recurso, o padrão mais comum em qualquer API REST, sai da lista de "requisições simples" do CORS e obriga o navegador a mandar um OPTIONS de verificação antes.
O servidor precisa responder ao preflight, não só ao PUT.
GET sem headers extras é sempre "simples".
Esse é justamente o sintoma de um bloqueio de CORS: o navegador rejeita a promise do fetch() antes de entregar qualquer dado ao JavaScript, sem detalhar o motivo. O problema é que essa mesma mensagem genérica também aparece em falhas de DNS, TLS ou conectividade, então o navegador não distingue as duas coisas para o script que fez a chamada.
Porque o GET provavelmente é uma requisição "simples" (sem preflight), enquanto o PUT dispara um OPTIONS que o servidor pode não estar tratando corretamente, respondendo Access-Control-Allow-Methods sem incluir PUT, por exemplo.
Tecnicamente sim, text/plain está na lista de tipos "simples", mas isso só desloca o problema: o servidor teria que confiar cegamente que o corpo é JSON válido sem a checagem de preflight, o que a maioria das APIs evita por segurança.
Não necessariamente. O navegador pode cachear o resultado do preflight pelo tempo definido em Access-Control-Max-Age, evitando repetir o OPTIONS a cada chamada dentro desse período.
O seu navegador faz a requisição de verdade para a URL informada, exatamente como qualquer página faria. Se a chamada for concluída, a origem atual foi autorizada. Se for bloqueada, o navegador nem chega a mostrar dados à página, esse já é o resultado.
Esta combinação de método e/ou headers sai da lista de "requisições simples" do CORS, então antes de enviar a requisição real, o navegador envia automaticamente um OPTIONS perguntando ao servidor se ela é permitida. Veja abaixo como esse preflight ficaria.
OPTIONS /items/1 Access-Control-Request-Method: PUT Origin: https://jkit.tools
A requisição de teste sai diretamente do seu navegador para a URL informada, o servidor do J-Kit nunca vê, resolve ou intermedeia esse endereço. É o mesmo tipo de chamada que qualquer script na sua própria página faria.