Je suis nouveau sur AngularJS, et pour commencer, j'ai pensé développer une nouvelle application utilisant uniquement AngularJS.
J'essaie de faire un appel AJAX côté serveur, à l'aide $http
de mon application angulaire.
Pour envoyer les paramètres, j'ai essayé ce qui suit:
$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);
});
Cela fonctionne, mais il utilise également jQuery sur $.param
. Pour supprimer la dépendance sur jQuery, j'ai essayé:
data: {username: $scope.userName, password: $scope.password}
mais cela semblait échouer. J'ai ensuite essayé params
:
params: {username: $scope.userName, password: $scope.password}
mais cela a également semblé échouer. J'ai ensuite essayé JSON.stringify
:
data: JSON.stringify({username: $scope.userName, password: $scope.password})
J'ai trouvé ces réponses possibles à ma quête, mais sans succès. Est-ce que je fais quelque chose de mal? Je suis sûr qu'AngularJS fournirait cette fonctionnalité, mais comment?
javascript
jquery
angularjs
ajax
angularjs-http
Veer Shrivastav
la source
la source
$http({method: 'post', url: URL, data: {username: $scope.userName, password: $scope.password}});
$scope.userName
définie? pourquoi n'avez-vous pas essayédata: data
?Réponses:
Je pense que vous devez faire est de transformer vos données d'objet non pas en chaîne JSON, mais en paramètres url.
Sur le blog de Ben Nadel .
Exemple d'ici .
METTRE À JOUR
Pour utiliser les nouveaux services ajoutés avec AngularJS V1.4, consultez
la source
angular.element
, vous pouvez simplementreturn 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('&');
Variables de codage d'URL utilisant uniquement les services AngularJS
Avec AngularJS 1.4 et versions ultérieures, deux services peuvent gérer le processus de codage d'url des données pour les requêtes POST, éliminant ainsi la nécessité de manipuler les données avec
transformRequest
ou en utilisant des dépendances externes comme jQuery:$httpParamSerializerJQLike
- un sérialiseur inspiré de jQuery.param()
( recommandé )$httpParamSerializer
- un sérialiseur utilisé par Angular lui-même pour les requêtes GETExemple d'utilisation
Voir une démo Plunker plus détaillée
Comment sont
$httpParamSerializerJQLike
et$httpParamSerializer
différentsEn général, il semble
$httpParamSerializer
utiliser un format de codage d'URL moins "traditionnel" que$httpParamSerializerJQLike
lorsqu'il s'agit de structures de données complexes.Par exemple (en ignorant le pourcentage de codage des crochets):
• Encodage d'un tableau
• Encodage d'un objet
la source
$http.({...
au lieu de`$http.post({...
Tous ces éléments semblent exagérés (ou ne fonctionnent pas) ... faites simplement ceci:
la source
Le problème est le format de chaîne JSON, vous pouvez utiliser une chaîne URL simple dans les données:
la source
encodeURIComponent($scope.userName)
pour encoder les données par URL ou vos paramètres seront corrompus si l'utilisateur entre une valeur comme"&myCustomParam=1"
Voici comment cela devrait être (et veuillez ne pas modifier le backend ... certainement pas ... si votre pile avant ne prend pas en charge
application/x-www-form-urlencoded
, alors jetez-le ... avec un peu de chance, AngularJS le fait!Fonctionne comme un charme avec AngularJS 1.5
Les gens, laissez-vous donner quelques conseils:
Utilisez des promesses
.then(success, error)
lorsque vous traitez$http
, oubliez.sucess
et.error
rappelez (car ils sont dépréciés)Sur le site angularjs ici " Vous ne pouvez plus utiliser la chaîne JSON_CALLBACK comme espace réservé pour spécifier où la valeur du paramètre de rappel doit aller. "
Si votre modèle de données est plus complexe que juste un nom d'utilisateur et un mot de passe, vous pouvez toujours le faire (comme suggéré ci-dessus)
Le document pour le
encodeURIComponent
peut être trouvé icila source
S'il s'agit d'un formulaire, essayez de remplacer l'en-tête par:
et si ce n'est pas un formulaire et un simple json alors essayez cet en-tête:
la source
$_POST
tableau vierge .!la source
À partir des documents $ http, cela devrait fonctionner.
la source
headers
n'affectera pas celuidata
qui devra encore être encodé en url, d'une manière ou d'une autre.vous devez publier un simple objet javascript, rien d'autre
si vous avez php comme back-end, vous devrez effectuer quelques modifications supplémentaires. consultez ce lien pour corriger le côté serveur php
la source
Bien qu'une réponse tardive, j'ai trouvé que UrlSearchParams angulaire fonctionnait très bien pour moi, il prend également en charge le codage des paramètres.
la source
Cela a fonctionné pour moi. J'utilise angular pour le front-end et laravel php pour le back-end. Dans mon projet, le web angulaire envoie des données json au back-end de laravel.
Ceci est mon contrôleur angulaire.
Ceci est mon contrôleur laravel php back-end.
Ceci est mon routage laravel
Le résultat dans le navigateur est
Il existe une extension chrome appelée postman. Vous pouvez utiliser pour tester votre URL principale, qu'elle fonctionne ou non. https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en
j'espère que ma réponse vous aidera.
la source