Eu sou novo no AngularJS e, para começar, pensei em desenvolver um novo aplicativo usando apenas o AngularJS.
Estou tentando fazer uma chamada AJAX para o lado do servidor, usando $http
meu aplicativo Angular.
Para enviar os parâmetros, tentei o seguinte:
$http({
method: "post",
url: URL,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $.param({username: $scope.userName, password: $scope.password})
}).success(function(result){
console.log(result);
});
Isso está funcionando, mas também está usando o jQuery $.param
. Para remover a dependência do jQuery, tentei:
data: {username: $scope.userName, password: $scope.password}
mas isso pareceu falhar. Então eu tentei params
:
params: {username: $scope.userName, password: $scope.password}
mas isso também pareceu falhar. Então eu tentei JSON.stringify
:
data: JSON.stringify({username: $scope.userName, password: $scope.password})
Encontrei essas respostas possíveis para minha busca, mas não obtive êxito. Estou fazendo algo errado? Tenho certeza de que o AngularJS forneceria essa funcionalidade, mas como?
javascript
jquery
angularjs
ajax
angularjs-http
Veer Shrivastav
fonte
fonte
$http({method: 'post', url: URL, data: {username: $scope.userName, password: $scope.password}});
$scope.userName
definido? por que você não tentoudata: data
?Respostas:
Eu acho que você precisa fazer é transformar seus dados de objeto não em JSON, mas em parâmetros de URL.
Do blog de Ben Nadel .
Exemplo daqui .
ATUALIZAR
Para usar novos serviços adicionados ao AngularJS V1.4, consulte
fonte
angular.element
, você pode simplesmentereturn angular.element.param(obj);
var obj = {a: 1, b: 2}; Object.keys(obj).reduce(function(p, c) { return p.concat([encodeURIComponent(c) + "=" + encodeURIComponent(obj[c])]); }, []).join('&');
Variáveis de codificação de URL usando apenas serviços AngularJS
Com o AngularJS 1.4 e superior, dois serviços podem lidar com o processo de codificação de dados de URL para solicitações POST, eliminando a necessidade de manipular os dados com
transformRequest
ou usando dependências externas como o jQuery:$httpParamSerializerJQLike
- um serializador inspirado no jQuery.param()
( recomendado )$httpParamSerializer
- um serializador usado pelo próprio Angular para solicitações GETExemplo de uso
Veja uma demonstração mais detalhada do Plunker
Como são
$httpParamSerializerJQLike
e$httpParamSerializer
diferentesEm geral, parece
$httpParamSerializer
usar menos formato de codificação de URL "tradicional" do que$httpParamSerializerJQLike
quando se trata de estruturas de dados complexas.Por exemplo (ignorando a porcentagem de codificação de colchetes):
• Codificando uma matriz
• Codificando um objeto
fonte
$http.({...
vez de`$http.post({...
Tudo isso parece um exagero (ou não funciona) ... basta fazer o seguinte:
fonte
O problema é o formato de sequência JSON. É possível usar uma sequência de URL simples nos dados:
fonte
encodeURIComponent($scope.userName)
a url codificar os dados ou seus parâmetros vão ser corrompidos se o usuário entra valor como"&myCustomParam=1"
Aqui está como deve ser (e por favor, sem alterações no back-end ... certamente não ... se sua pilha da frente não suportar
application/x-www-form-urlencoded
, jogue-a fora ... espero que o AngularJS faça!Funciona como um encanto com o AngularJS 1.5
Gente, vamos dar alguns conselhos:
use promessas
.then(success, error)
ao lidar com$http
, esquecer.sucess
e.error
retornos de chamada (como estão sendo preteridos)No site angularjs, aqui " Você não pode mais usar a string JSON_CALLBACK como um espaço reservado para especificar para onde deve ir o valor do parâmetro de retorno de chamada. "
Se o seu modelo de dados for mais complexo que apenas um nome de usuário e uma senha, você ainda poderá fazer isso (como sugerido acima)
O documento para o
encodeURIComponent
pode ser encontrado aquifonte
Se for um formulário, tente alterar o cabeçalho para:
e se não for um formulário e um json simples, tente este cabeçalho:
fonte
$_POST
matriz em branco .!fonte
Nos documentos $ http, isso deve funcionar.
fonte
headers
não afetaria odata
que ainda precisará ser codificado em url, de uma maneira ou de outra.você precisa postar objeto javascript simples, nada mais
se você tiver o php como back-end, precisará fazer mais algumas modificações. confira este link para corrigir o lado do servidor php
fonte
Embora seja uma resposta tardia, achei que o UrlSearchParams angular funcionou muito bem para mim, mas também cuida da codificação de parâmetros.
fonte
Isso funcionou para mim. Eu uso angular para front-end e laravel php para back-end. No meu projeto, a web angular envia dados json para o back-end do laravel.
Este é o meu controlador angular.
Este é o meu controlador laravel de back-end php.
Este é o meu roteamento laravel
O resultado no navegador é
Existe uma extensão do chrome chamada carteiro. Você pode usar para testar seu URL de back-end, se está funcionando ou não. https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en
espero que minha resposta o ajude.
fonte