No código abaixo, o $http
método AngularJS chama o URL e envia o objeto xsrf como uma "Carga útil da solicitação" (conforme descrito na guia Rede do depurador do Chrome). O $.ajax
método jQuery faz a mesma chamada, mas envia xsrf como "Form Data".
Como posso fazer o AngularJS enviar xsrf como dados do formulário em vez de uma carga útil de solicitação?
var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};
$http({
method: 'POST',
url: url,
data: xsrf
}).success(function () {});
$.ajax({
type: 'POST',
url: url,
data: xsrf,
dataType: 'json',
success: function() {}
});
ajax
angularjs
post
angular-http
mjibson
fonte
fonte
Respostas:
A seguinte linha precisa ser adicionada ao objeto $ http que é passado:
E os dados transmitidos devem ser convertidos em uma string codificada em URL:
Então você tem algo como:
De: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
ATUALIZAR
Para usar novos serviços adicionados ao AngularJS V1.4, consulte
fonte
var xsrf = $.param({fkey: "key"});
Isso é estúpido, por que o angular não pode fazer isso internamente?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Se você não quiser usar o jQuery na solução, tente isso. Solução aqui retirada https://stackoverflow.com/a/1714899/1784301
fonte
for
um pouco a instrução a ser usadaangular.forEach
.obj[p]
não é nulo ou indefinido . Caso contrário, você acabará enviando uma string "nula" ou "indefinida" como o valor.transformRequest: function(obj)
Como obj é indefinido, devemos passar o xsrf? Gosto #transformRequest: function(xsrf)
A confusão contínua em torno desse problema me inspirou a escrever um post sobre o assunto. A solução que proponho neste post é melhor que a sua melhor solução atual, porque não restringe você a parametrizar seu objeto de dados para chamadas de serviço $ http; ou seja, com a minha solução, você pode simplesmente continuar transmitindo objetos de dados reais para $ http.post () etc., e ainda alcançar o resultado desejado.
Além disso, a resposta mais bem avaliada depende da inclusão de jQuery completo na página para a função $ .param (), enquanto minha solução é independente de jQuery, pronta para AngularJS pura.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Espero que isto ajude.
fonte
ASP.NET
não apoiava 'nativamente' isso. Se você não quiser alterar o comportamento do AngularJS (o que eu não fiz, porque minha API retorna JSON, por que não aceitar o JSON também, é mais flexível do que os dados do formulário), você pode ler a partirRequest.InputStream
dela e manipulá-la de qualquer maneira você quer isso. (Eu escolhi para desserializar-lo paradynamic
para facilidade de uso.)Peguei algumas das outras respostas e fiz algo um pouco mais limpo. Coloque essa
.config()
chamada no final do seu angular.module no seu app.js:fonte
unshift()
para que as outras transformações permaneçam imperturbáveis. Bom trabalho.A partir do AngularJS v1.4.0, há um
$httpParamSerializer
serviço interno que converte qualquer objeto em uma parte de uma solicitação HTTP de acordo com as regras listadas na página de documentos .Pode ser usado assim:
Lembre-se de que, para uma postagem de formulário correta, o
Content-Type
cabeçalho deve ser alterado. Para fazer isso globalmente em todas as solicitações POST, esse código (extraído da meia resposta de Albireo) pode ser usado:Para fazer isso apenas na postagem atual, a
headers
propriedade do objeto de solicitação precisa ser modificada:fonte
transformRequest: $httpParamSerializer, data: formDataObj
. Obrigado pela solução.Você pode definir o comportamento globalmente:
Portanto, você não precisa redefini-lo sempre:
fonte
Como solução alternativa, você pode simplesmente fazer o código que recebe o POST responder aos dados do aplicativo / json. Para o PHP, eu adicionei o código abaixo, permitindo-me postar nele em formato codificado ou JSON.
fonte
Essas respostas parecem um exagero insano; às vezes, simples é apenas melhor:
fonte
Content-Type
e configurá-lo comoapplication/x-www-form-urlencoded
.Você pode tentar com a solução abaixo
fonte
Crie um serviço de adaptador para postagem:
Use-o em seus controladores ou o que for:
fonte
Há um tutorial muito bom que aborda esse e outros assuntos relacionados - Enviando formulários AJAX: a maneira do AngularJS .
Basicamente, você precisa definir o cabeçalho da solicitação POST para indicar que está enviando dados do formulário como uma string codificada em URL e definir os dados para que sejam enviados no mesmo formato
Observe que a função auxiliar param () do jQuery é usada aqui para serializar os dados em uma string, mas você pode fazer isso manualmente também se não estiver usando o jQuery.
fonte
$.param
fazer a mágica. solução perfeita para quem possui o aplicativo baseado em jQuery + AngularJS.Por favor verifique! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
fonte
Para usuários do Symfony2:
Se você não deseja alterar nada no seu javascript para que isso funcione, você pode fazer estas modificações no aplicativo symfony:
Crie uma classe que estenda a classe Symfony \ Component \ HttpFoundation \ Request:
Agora use sua classe em app_dev.php (ou qualquer arquivo de índice que você use)
fonte
Basta definir o tipo de conteúdo não é suficiente, codificar os dados do formulário antes de enviar.
$http.post(url, jQuery.param(data))
fonte
Atualmente, estou usando a seguinte solução que encontrei no grupo do Google AngularJS.
Observe que se você estiver usando PHP, precisará usar algo como o componente HTTP do Symfony 2
Request::createFromGlobals()
para ler isso, pois o $ _POST não será carregado automaticamente com ele.fonte
O AngularJS está fazendo isso da mesma maneira que faz o seguinte tipo de conteúdo dentro do cabeçalho da solicitação http:
Se você estiver usando php como eu, ou mesmo com o Symfony2, pode simplesmente estender a compatibilidade do servidor para o padrão json como descrito aqui: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html
A maneira Symfony2 (por exemplo, dentro do seu Controlador Padrão):
A vantagem seria que você não precisa usar o jQuery param e pode usar o AngularJS como sua maneira nativa de fazer essas solicitações.
fonte
Resposta completa (desde o angular 1.4). Você precisa incluir a dependência $ httpParamSerializer
fonte
Na configuração do seu aplicativo -
Com sua solicitação de recurso -
fonte
Esta não é uma resposta direta, mas uma direção de design um pouco diferente:
Não publique os dados como um formulário, mas como um objeto JSON para ser mapeado diretamente para o objeto do lado do servidor ou use a variável de caminho de estilo REST
Agora eu sei que nenhuma opção pode ser adequada no seu caso, pois você está tentando passar uma chave XSRF. Mapear isso em uma variável de caminho como esta é um design terrível:
Porque, por natureza, você gostaria de passar a chave xsrf para outro caminho também
/login
,/book-appointment
etc. , e não quer mexer na sua URL bonitaCuriosamente, adicioná-lo como um campo de objeto também não é apropriado, porque agora em cada objeto json que você passa para o servidor, é necessário adicionar o campo
Você certamente não deseja adicionar outro campo à sua classe do servidor que não tenha uma associação semântica direta com o objeto de domínio.
Na minha opinião, a melhor maneira de passar sua chave xsrf é através de um cabeçalho HTTP. Muitas bibliotecas de estruturas da web do lado do servidor do xsrf protection suportam isso. Por exemplo, no Java Spring, você pode transmiti-lo usando o
X-CSRF-TOKEN
cabeçalho .A excelente capacidade do Angular de vincular o objeto JS ao objeto da interface do usuário significa que podemos nos livrar da prática de postar todos os formulários juntos e, em vez disso, publicar o JSON. O JSON pode ser facilmente desserializado no objeto do lado do servidor e suportar estruturas de dados complexas, como mapa, matrizes, objetos aninhados, etc.
Como você publica uma matriz em uma carga útil de formulário? Talvez assim:
ou isto:
Ambos têm um design ruim.
fonte
É o que estou fazendo para a minha necessidade. Onde preciso enviar os dados de login para a API como dados do formulário e o objeto Javascript (userData) está sendo convertido automaticamente em dados codificados em URL
É assim que meus dados de usuário são
fonte
O único problema que você precisa alterar é usar a propriedade "params" em vez de "data" quando você cria seu objeto $ http:
No exemplo acima, clients [i] é apenas um objeto JSON (não serializado de forma alguma). Se você usar "params" em vez de "angular de dados", serializará o objeto para você usando $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
fonte
Use o
$http
serviço AngularJS e use seupost
método ou configure a$http
função.fonte