Eu tenho um código antigo que está fazendo uma solicitação AJAX POST por meio do método post do jQuery e se parece com isto:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
é apenas um objeto javascript com algumas propriedades básicas de string.
Estou movendo nosso material para usar o Angular e desejo substituir esta chamada por $ http.post. Eu vim com o seguinte:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Quando fiz isso, recebi uma resposta de erro 500 do servidor. Usando o Firebug, descobri que ele enviou o corpo da solicitação assim:
{"param1":"value1","param2":"value2","param3":"value3"}
O jQuery bem-sucedido $.post
envia o corpo assim:
param1=value1¶m2=value2¶m3=value3
O ponto de extremidade que estou atingindo está esperando parâmetros de solicitação e não JSON. Então, minha pergunta é: há como dizer $http.post
para enviar o objeto javascript como parâmetros de solicitação em vez de JSON? Sim, eu sei que poderia construir a string sozinho a partir do objeto, mas quero saber se o Angular fornece algo para isso fora da caixa.
fonte
$httpProvider.defaults
, e não funcionar, alguma pista sobre isso?Cannot read property "jquery" of undefined.
Como faço para corrigir isso? PS. As transformações por chamada funcionam.Se estiver usando Angular> = 1,4 , aqui está a solução mais limpa que descobri que não depende de nada personalizado ou externo:
E então você pode fazer isso em qualquer lugar em seu aplicativo:
E ele serializará corretamente os dados
param1=value1¶m2=value2
e os enviará/requesturl
com oapplication/x-www-form-urlencoded; charset=utf-8
cabeçalho Content-Type, como normalmente é esperado com solicitações POST em terminais.fonte
Da documentação do AngularJS:
Portanto, forneça string como parâmetros. Se você não quiser isso, use transformações. Novamente, a partir da documentação:
Consulte a documentação para obter mais detalhes.
fonte
Use a
$.param
função jQuery para serializar os dados JSON em requestData.Resumindo, usando um código semelhante ao seu:
Para usar isso, você deve incluir jQuery em sua página junto com AngularJS.
fonte
Observe que, a partir do Angular 1.4, você pode serializar os dados do formulário sem usar jQuery.
No app.js:
Então, em seu controlador:
fonte
Isso pode ser um pouco um hack, mas evitei o problema e converti o json na matriz POST do PHP no lado do servidor:
fonte
Também tenho problemas com a configuração da autenticação http personalizada porque $ resource armazena a solicitação em cache.
Para fazer funcionar, você deve sobrescrever os cabeçalhos existentes fazendo isso
Espero ter ajudado alguém. Levei 3 dias para descobrir isso.
fonte
Modifique os cabeçalhos padrão:
Em seguida, use o
$.param
método JQuery :fonte
fonte
Ajuste rápido - para aqueles que estão tendo problemas com a configuração global da função transformRequest, aqui está o snippet que estou usando para se livrar do
Cannot read property 'jquery' of undefined
erro:fonte
Você também pode resolver este problema sem alterar o código no servidor, alterar o cabeçalho na
$http.post
chamada e usar$_POST
a forma normal. Explicado aqui: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/fonte
Achei muitas vezes um comportamento problemático desse todo. Usei-o do express (sem tipificações) e do bodyParser (com as tipificações dt ~ body-parser).
Não tentei fazer upload de um arquivo, em vez disso, simplesmente interpretar um JSON fornecido em uma string de postagem.
O
request.body
era simplesmente um json ({}
) vazio .Depois de muita investigação, finalmente isso funcionou para mim:
Também pode ser importante fornecer o
application/json
tipo de conteúdo na string de solicitação do lado do cliente.fonte
Sintaxe para AngularJS v1.4.8 + (v1.5.0)
Por exemplo:
fonte