JQuery Ajax está enviando GET em vez de POST

87

O código a seguir aciona uma solicitação GET em vez de uma solicitação POST HTTP.

function AddToDatabase() {
  this.url = './api/add';
}

AddToDatabase.prototype.postData = function(dataToPost) {
$.ajax({
    type: "POST",
    url: this.url,
    data: dataToPost,
    context: this,
    success: this.onSuccess
  });
};


var AddToDatabase = new AddToDatabase();
data = {data: 'coucou'};
AddToDatabase.postData(data);

Por que e como posso obter um POST?


Vejo no Google Chrome Inspect e no Firefox Inspect que o navegador envia um GET. Aqui está do Chrome:

URL de solicitação: http: // localhost / CÓDIGOS DE AMOSTRA / UPDATE% 20MYSQL / api / add / Método de solicitação: Código de status GET: 200 OK


RESOLVIDO

A URL chamada './api/add' era para realmente postar em './api/add/index.php'. Acontece que chamar './api/add /index.php' ou './api/add /' me dá uma solicitação POST.

Era apenas um URL errado, mas por algum motivo eu estava recebendo uma solicitação GET bem-sucedida para '.api / add /'.

Timothée HENRY
fonte
2
Por que você acha que será uma solicitação GET?
Viktor S.
1
Você tentou executar a chamada ajax no firefox com o painel de rede aberto no firebug?
Fabrizio Calderan
2
Teste - se você executá-lo e verificar o painel de rede, verá que ele envia uma solicitação de postagem
Viktor S.
1
@tucson - como já escrevi - verifique seu arquivo .htaccess. Possivelmente, ele redireciona em vez de reescrever. Basicamente, vejo que JS está OK (espere aquele ponto na url './api/add' que me confunde). Portanto, parece mais um problema do lado do servidor. E a informação na sua pergunta não é suficiente para dar uma ajuda específica
Viktor S.
1
Adicione a solução como a resposta, por favor
Adam Lynch

Respostas:

101

Algum problema no MVC. Por algum motivo, quando removo o [HttPost], ele funciona conforme o esperado, embora eu esteja dizendo ao ajax para usar o POST.

  • Acontece que você precisa usar

tipo: "POST"

  • Mesmo que o exemplo na página jQuery diga para usar

método: "POST"

Agora é POST's

Mas depois de cavar na documentação, encontrei isso.

insira a descrição da imagem aqui

Piotr Kula
fonte
6
este é o problema que eu estava tendo. não percebi que o nome da opção foi alterado em 1.9. Pensei que fosse sempre "método"
Bill Garrison
2
Não vejo nenhum problema em incluir ambos, só para ter certeza. { method : "POST", type: "POST" }
Scott
Sim, você pode incluir o que quiser no construtor, mas incluir ambos para compatibilidade não faz muito sentido. A maioria das pessoas estará usando 1.11 ou 2.1 agora de qualquer maneira. Isso só causa um problema após a atualização de 1.4.3 ou 1.6.2
Piotr Kula
3
Passei tanto tempo tentando consertar isso na sexta-feira, atualizando um front-end antigo para usar uma API totalmente nova. Muito obrigado!
NobleUplift
31

Eu tive esse problema e, de acordo com a sugestão de @Fangle, foi porque meu .htaccess estava removendo barras à direita - e eu havia definido o url como /ajax/foo/bar/e não /ajax/foo/bar. O redirecionamento altera a solicitação de POST para GET. Remova o / e problema resolvido!

texelate
fonte
Isso resolveu exatamente o problema mencionado na pergunta original para mim. Estou hospedando um aplicativo laravel no Wamp 3.0.6
İlter Kağan Öcal
10

O URL './api/add'realmente foi redirecionado para './api/add/index.php'. portanto, esse efeito colateral bizarro que a nova solicitação após o redirecionamento enviou usando em GETvez dePOST

Solução

  • use o url completo './api/add/index.php'
  • ou adicione uma barra './api/add/'.
Jossef Harush
fonte
6

Notei esse comportamento também onde meu POST estava enviando um GET. O cenário é bastante único, mas talvez ajude alguém.

Isso estava acontecendo comigo na minha página de edição de função do usuário, onde eu estava usando ajax (post) como uma ação imediata quando uma função era marcada ou desmarcada.

Também configurei o servidor para reautenticar o usuário (e redirecioná-lo) sempre que suas informações de função fossem alteradas, para que suas declarações fossem atualizadas.

O ciclo brutal terminou como:

  1. Atualização da primeira função - POST - sucesso 200

  2. Próxima atualização de função - POST - 302 encontrado -> Redirecionar (não percebi isso até usar o Fiddler em vez do monitor de rede do Chrome)

  3. Redirecionar chamada de (2) (mesmo URL) - GET - 404 não encontrado (já que eu só permiti postagem)

  4. GOTO (1)

Acabei alterando o servidor para ignorar a atualização de reautenticação / declarações quando detectou uma solicitação ajax (com base nos tipos de aceitação).

emragins
fonte
Muito obrigado!
machineaddict de
Uau! Enfrentou algo semelhante. Aparentemente, no meu nível de controlador, ele esperava um parâmetro de sessão que não incluí no novo endpoint do controlador e estava fazendo um 302 e depois um GET. Obrigado cara.
Nimila Hiranya
5

Descobri que ao usá- dataType: 'jsonp'lo converte a solicitação em um GET. Eu mudei para dataType: 'json'mudou de GETpara POST.

Tomjac
fonte
Você sabe o motivo pelo qual esse comportamento foi observado?
Saurabh Sarathe
@SaurabhSarathe - JSONP funciona gerando elementos de script que só podem gerar solicitações GET.
Quentin
3

Tive um problema semelhante e começou a funcionar para mim assim que removi o código rígido https://do meu url.

jQuery.ajax({
 type: "POST",
 url: "www.someurl.com",//instead of "https://www.someurl.com"
 data: { foo:"bar"},
 success: function(d){ console.log(d); },
 dataType: "JSONP"
});
Parham
fonte
Isso parece mais um problema entre HTTP e HTTPS (ou seja, seu www.someurl.com não tem um certificado válido)
Alexis Wilke
2

Para mim, seu trecho de código parece bom, mas se você quiser ter certeza, pode usar $ .post em vez de $ .ajax

$.post('ajax/test.html', function(data) {
 $('.result').html(data);
});

link jquery: http://api.jquery.com/jQuery.post/

Mr_DeLeTeD
fonte
8
posté apenas um método abreviado para $ .ajax ({type: 'POST'})
Viktor S.
Sim, mas como seu código parece bom. quando estou testando, ele faz alguma solicitação de postagem
Mr_DeLeTeD
1

Verifique seu arquivo .htaccess ou pesquise por alguma outra coisa que pode redirecionar sua solicitação

Viktor S.
fonte
1

Tive o mesmo problema e encontrei esta questão, mas as respostas não resolveram o meu problema. Acabei resolvendo isso removendo o contentTypecampo na solicitação ajax.

contentType: "application/json",
Farid Movsumov
fonte
1

Eu tive esse problema e acabou sendo um módulo de regravação de URL no IIS.

Estou usando ASP.NET MVC e WebAPI. Eu criei uma regra para forçar URLs em minúsculas para que as redes sociais não vejam o mesmo URL como duas páginas diferentes.

Por exemplo:

" http://url.com/View/Something/123GuidIdSomething "

vs

" http://url.com/view/something/123guididsomething "

Isso, entretanto, estava de alguma forma bagunçando minhas solicitações de ajax. Desativei a regra e o problema foi resolvido.

Callan
fonte
0

um erro muito comum é usar o tipo de botão como enviar e não alterar o método do formulário (que é obtido por padrão)

certifique-se de não usar o tipo de botão enviar e, se o fizer, alterou o método do formulário para postar

Junaid Masood
fonte