Os redirecionamentos HTTP são feitos pelos códigos HTTP 301 e 302 (talvez outros códigos também) e um campo de cabeçalho conhecido como "Local", que possui o endereço do novo local a ser percorrido. No entanto, os navegadores sempre enviam uma solicitação "GET" para esse URL.
No entanto, muitas vezes você precisa redirecionar seu usuário para outro domínio via POST (pagamentos bancários, por exemplo). Este é um cenário comum e realmente um requisito. Alguém sabe por que um requisito tão comum foi negligenciado na especificação HTTP? A solução alternativa é enviar um formulário (com parâmetros em campos ocultos) com ação definida para o local de destino (o valor do campo de cabeçalho Local ) e usar setTimeout
para enviar o formulário para o local de destino.
fonte
Respostas:
No HTTP 1.1, existe realmente um código de status ( 307 ) que indica que a solicitação deve ser repetida usando o mesmo método e postar dados .
Como outros já disseram, existe um potencial de uso indevido aqui, e pode ser por isso que muitas estruturas aderem a 301 e 302 em suas abstrações. No entanto, com o entendimento adequado e o uso responsável, você deve conseguir o que está procurando.
Observe que, de acordo com a especificação do W3.org , quando
METHOD
não éHEAD
ouGET
, os agentes do usuário devem avisar o usuário antes de executar novamente a solicitação no novo local. Você também deve fornecer uma observação e um mecanismo de fallback para o usuário, caso os agentes antigos não tenham certeza do que fazer com um 307.Usando este formulário:
E com o Test307.aspx, basta retornar 307 com o Local: http://google.com , o Chrome 13 e o Fiddler confirmam que "test = the test" é realmente publicado no Google. É claro que a resposta é 405, já que o Google não permite o POST, mas mostra a mecânica.
Para obter mais informações, consulte Lista de códigos de status HTTP e a especificação W3.org .
fonte
Encontrei uma boa explicação nesta página aqui .
Embora eu não seja fã de restringir os usuários tecnicamente para impedir que causem problemas indesejados ou causem danos indesejados aos seus aplicativos, posso entender o ponto e faz sentido.
fonte
GET (e alguns outros métodos) são definidos como 'SEGURO' na especificação http ( RFC 2616 ):
Isso significa que uma solicitação GET nunca deve ter conseqüências sérias para o usuário, além de ver algo que ele pode não querer ver, mas uma solicitação POST pode alterar um recurso importante para eles ou para outras pessoas.
Embora isso tenha mudado com o JavaScript, tradicionalmente havia interfaces de usuário diferentes - os usuários podiam acionar solicitações GET clicando nos links, mas precisavam preencher um formulário para acionar uma solicitação POST. Eu acho que os designers de HTTP estavam interessados em manter a distinção entre métodos seguros e não seguros.
Também não acho que seja necessário redirecionar para um POST. Presumivelmente, qualquer ação que precise ser executada chamando uma função no código do servidor ou, se for necessário, em um servidor diferente, em vez de enviar um redirecionamento contendo uma URL para o POST do navegador, o servidor poderia fazer uma solicitação para o próprio servidor, agindo como um proxy para o usuário.
fonte