Alguém poderia me dizer por que a seguinte declaração não envia os dados de postagem para o URL designado? O URL é chamado, mas no servidor quando imprimo $ _POST - recebo uma matriz vazia. Se eu imprimir uma mensagem no console antes de adicioná-la aos dados - ele mostrará o conteúdo correto.
$http.post('request-url', { 'message' : message });
Eu também tentei com os dados como string (com o mesmo resultado):
$http.post('request-url', "message=" + message);
Parece estar funcionando quando eu o uso no seguinte formato:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
mas existe uma maneira de fazer isso com o $ http.post () - e eu sempre tenho que incluir o cabeçalho para que ele funcione? Acredito que o tipo de conteúdo acima esteja especificando o formato dos dados enviados, mas posso enviá-lo como objeto javascript?
angularjs
post
angular-http
Spencer Mark
fonte
fonte
Respostas:
Eu tive o mesmo problema usando asp.net MVC e encontrei a solução aqui
Funciona como um encanto.
CÓDIGO
fonte
bower install angular-post-fix --save-dev
para adicioná-lo.Não está super claro acima, mas se você estiver recebendo a solicitação em PHP, poderá usar:
$params = json_decode(file_get_contents('php://input'),true);
Para acessar uma matriz em PHP a partir de um AngularJS POST.
fonte
json_decode(file_get_contents('php://input'), true);
Você pode definir o "Tipo de conteúdo" padrão assim:
Sobre o
data
formato:Tente usar essa variação
fonte
Eu tive um problema semelhante e gostaria de saber se isso também pode ser útil: https://stackoverflow.com/a/11443066
Saudações,
fonte
Eu gosto de usar uma função para converter objetos para postar parâmetros.
fonte
Finalmente, isso foi resolvido no angular 1.4 usando $ httpParamSerializerJQLike
Consulte https://github.com/angular/angular.js/issues/6039
fonte
Eu uso jQuery param com AngularJS pós requrest. Aqui está um exemplo ... crie o módulo de aplicativo AngularJS, onde
myapp
é definidong-app
no seu código HTML.Agora vamos criar um controlador de login e um e-mail e senha do POST.
Não gosto de explicar o código, é simples o suficiente para entender :) Observe que
param
é do jQuery, portanto você deve instalar o jQuery e o AngularJS para fazê-lo funcionar. Aqui está uma captura de tela.Espero que isso seja útil. Obrigado!
fonte
Eu tive o mesmo problema com AngularJS e Node.js + Express 4 + Router
O roteador espera os dados da solicitação da postagem no corpo. Esse corpo estava sempre vazio se eu seguisse o exemplo do Angular Docs
Notação 1
Mas se eu o usasse nos dados
Notação 2
Editar 1:
Caso contrário, o roteador node.js. esperará os dados em req.body se for usada a notação 1:
O que também envia as informações como carga útil JSON. Isso é melhor em alguns casos em que você tem matrizes no json e x-www-form-urlencoded causará alguns problemas.
funcionou. Espero que ajude.
fonte
Diferentemente do JQuery e pelo pedantismo, o Angular usa o formato JSON para transferência de dados POST de um cliente para o servidor (o JQuery aplica presumivelmente o código x-www-form-urlencoded, embora o JQuery e o Angular usem o JSON para a entrada de dados). Portanto, existem duas partes do problema: na parte do cliente js e na parte do servidor. Então você precisa:
Coloque a parte do cliente js Angular assim:
E
escreva na parte do servidor para receber dados de um cliente (se for php).
Nota: $ _POST não funcionará!
A solução funciona para mim, espero, e para você.
fonte
Para enviar dados via Post methode com
$http
angularjs, é necessário alterardata: "message=" + message
comdata: $.param({message:message})
fonte
Para aproveitar a resposta de @ felipe-miosso:
Adicione-o ao seu aplicativo:
fonte
Não tenho reputação de comentar, mas em resposta / adição à resposta de Don F:
$params = json_decode(file_get_contents('php://input'));
Um segundo parâmetro de
true
precisa ser adicionado àjson_decode
função para retornar corretamente uma matriz associativa:$params = json_decode(file_get_contents('php://input'), true);
fonte
Angular
WebAPI 2
fonte
Este código resolveu o problema para mim. É uma solução em nível de aplicativo:
fonte
Adicione isso no seu arquivo js:
e adicione isso ao seu arquivo de servidor:
Isso deve funcionar.
fonte
Eu também enfrentei um problema semelhante e estava fazendo algo assim e isso não funcionou. Meu controlador Spring não conseguiu ler o parâmetro de dados.
Mas, lendo este fórum e o API Doc, tentei seguir o caminho e isso funcionou para mim. Se alguém também tiver um problema semelhante, você também pode tentar abaixo.
Verifique https://docs.angularjs.org/api/ng/service/ $ http # post para saber o que o param config faz. {data: '"id": "1"'} - Mapa de strings ou objetos que serão convertidos em URL? data = "id: 1"
fonte
essa provavelmente é uma resposta tardia, mas acho que a maneira mais adequada é usar o mesmo pedaço de código de uso angular ao fazer uma solicitação "get" usando, você
$httpParamSerializer
precisará injetá-la no seu controlador para que você possa simplesmente fazer o seguinte sem precisar use o Jquery,$http.post(url,$httpParamSerializer({param:val}))
fonte
No meu caso, resolvo o problema assim:
Você precisa usar JSON.stringify para cada parâmetro que contém um objeto JSON e, em seguida, construa seu objeto de dados com "$ .param" :-)
NB: Meu "objJSON" é um objeto JSON que contém conteúdo de matriz, número inteiro, string e html. Seu tamanho total é> 3500 caracteres.
fonte
Eu sei que aceitou resposta. Porém, seguir pode ajudar os futuros leitores, se a resposta não for adequada a eles por qualquer motivo.
Angular não faz ajax como jQuery. Enquanto eu tentava seguir o guia para modificar angular
$httpprovider
, encontrei outros problemas. Por exemplo, eu uso o codeigniter no qual a$this->input->is_ajax_request()
função sempre falhava (que foi escrita por outro programador e usada globalmente, portanto não é possível alterar) dizendo que essa não era uma solicitação real do ajax.Para resolvê-lo, tomei ajuda de promessa adiada . Eu testei no Firefox e ie9 e funcionou.
Eu tenho a seguinte função definida fora de qualquer código angular. Essa função faz chamadas regulares a jquery ajax e retorna objeto adiado / prometido (ainda estou aprendendo).
Então, eu estou chamando de código angular usando o código a seguir. Por favor, note que temos que atualizar o
$scope
manualmente usando$scope.$apply()
.Esta pode não ser a resposta perfeita, mas me permitiu usar chamadas jquery ajax com angular e me permitiu atualizar o
$scope
.fonte
Eu tive o mesmo problema no express .. para resolver, você precisa usar o bodyparser para analisar objetos json antes de enviar solicitações http.
fonte
Espero que ajude.
fonte
Não encontrou um trecho de código completo de como usar o método $ http.post para enviar dados ao servidor e por que não estava funcionando nesse caso.
Explicações do trecho de código abaixo ...
Configurando o Tipo de Conteúdo na variável de configuração que será passada junto com a solicitação do angularJS $ http.post que instrui o servidor que estamos enviando dados no formato www post.
Observe o método $ htttp.post, onde estou enviando o primeiro parâmetro como url, o segundo parâmetro como dados (serializado) e o terceiro parâmetro como config.
O código restante é auto-entendido.
Veja o exemplo de código do método $ http.post aqui .
fonte
Se você estiver usando PHP, é uma maneira fácil de acessar uma matriz em PHP a partir de um AngularJS POST.
fonte
Se estiver usando Angular> = 1.4 , aqui está a solução mais limpa usando o serializador fornecido pela Angular :
E então você pode simplesmente fazer isso em qualquer lugar do seu aplicativo:
E ele serializará os dados corretamente
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 nos terminais.TL; DR
Durante minha pesquisa, descobri que a resposta para esse problema tem muitos sabores diferentes; alguns são muito complicados e dependem de funções personalizadas, outros dependem do jQuery e outros incompletos ao sugerir que você só precisa definir o cabeçalho.
Se você acabou de definir o
Content-Type
cabeçalho, o ponto final verá os dados POST, mas não estarão no formato padrão porque, a menos que você forneça uma string como suadata
ou serialize manualmente seu objeto de dados, tudo será serializado como JSON por padrão e pode ser interpretado incorretamente no terminal.por exemplo, se o serializador correto não foi definido no exemplo acima, ele seria visto no terminal como:
E isso pode levar a uma análise inesperada, por exemplo, o ASP.NET o trata como um
null
nome de parâmetro, com{"param1":"value1","param2":"value2"}
como valor; ou o Fiddler interpreta de outra maneira, com{"param1":"value1","param2":"value2"}
o nome do parâmetro enull
o valor.fonte
Semelhante ao formato de trabalho sugerido pelo OP e à resposta de Denison, exceto usando em
$http.post
vez de just$http
e ainda depende do jQuery.A coisa boa sobre o uso do jQuery aqui é que objetos complexos são transmitidos corretamente; contra a conversão manual em parâmetros de URL que podem distorcer os dados.
fonte
Quando tive esse problema, o parâmetro que eu estava postando acabou sendo uma matriz de objetos em vez de um objeto simples.
fonte
Recém-atualizado do angular 1.2 ao 1.3, encontramos um problema no código. Transformar um recurso levará a um loop infinito, porque (eu acho) da promessa $ mantendo novamente o mesmo objeto. Talvez ajude alguém ...
Eu poderia consertar isso da seguinte maneira:
fonte
Estou usando o código de resposta aceito (código de Felipe) há um tempo e está funcionando muito bem (obrigado, Felipe!).
No entanto, recentemente descobri que há problemas com objetos ou matrizes vazios. Por exemplo, ao enviar este objeto:
O PHP parece não ver B e C. Entende isso:
Uma olhada na solicitação real no Chrome mostra isso:
Eu escrevi um trecho de código alternativo. Parece funcionar bem com meus casos de uso, mas não o testei extensivamente, portanto, use com cuidado.
Eu usei o TypeScript porque gosto de digitação forte, mas seria fácil converter para JS puro:
É menos eficiente que o código de Felipe, mas não acho que isso importe muito, pois deve ser imediato comparado à sobrecarga geral da própria solicitação HTTP.
Agora o PHP mostra:
Até onde eu sei, não é possível fazer com que o PHP reconheça que Ba e C são matrizes vazias, mas pelo menos as chaves aparecem, o que é importante quando há código que depende de uma determinada estrutura, mesmo quando essencialmente vazio por dentro.
Observe também que ele converte se indefinido e nulo em cadeias vazias.
fonte
Basta colocar os dados que você deseja enviar como segundo parâmetro:
Outra forma que também funciona é:
Certifique-se de que
paramName
corresponde exatamente ao nome do parâmetro da função que você está chamando.Fonte: método de atalho de publicação do AngularJS
fonte
Eu resolvi isso pelos códigos abaixo:
Lado do cliente (Js):
observe que os dados são um objeto.
No servidor (ASP.NET MVC):
e 'AllowCrossSiteJsonAttribute' é necessário para solicitações entre domínios:
Espero que isso tenha sido útil.
fonte