Dans le code ci-dessous, la $http
méthode AngularJS appelle l'URL et soumet l'objet xsrf en tant que "Request Payload" (comme décrit dans l'onglet réseau du débogueur Chrome). La $.ajax
méthode jQuery effectue le même appel, mais soumet xsrf en tant que "Données de formulaire".
Comment puis-je demander à AngularJS de soumettre xsrf en tant que données de formulaire au lieu d'une charge utile de demande?
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
la source
la source
Réponses:
La ligne suivante doit être ajoutée à l'objet $ http transmis:
Et les données transmises doivent être converties en une chaîne codée URL:
Vous avez donc quelque chose comme:
De: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
MISE À JOUR
Pour utiliser les nouveaux services ajoutés avec AngularJS V1.4, consultez
la source
var xsrf = $.param({fkey: "key"});
C'est stupide, pourquoi angulaire ne peut-il pas le faire en interne?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Si vous ne souhaitez pas utiliser jQuery dans la solution, vous pouvez essayer ceci. Solution récupérée d'ici https://stackoverflow.com/a/1714899/1784301
la source
for
un peu l' instruction à utiliser à laangular.forEach
place.obj[p]
n'est pas nul ou indéfini . Sinon, vous finirez par envoyer une chaîne "nulle" ou "non définie" comme valeur.transformRequest: function(obj)
Comme obj n'est pas défini, supposons-nous passer le xsrf? CommetransformRequest: function(xsrf)
La confusion continue entourant ce problème m'a inspiré à écrire un blog à ce sujet. La solution que je propose dans ce post est meilleure que votre solution actuelle la mieux notée car elle ne vous limite pas à paramétrer votre objet de données pour les appels de service $ http; c'est-à-dire qu'avec ma solution, vous pouvez simplement continuer à transmettre des objets de données réels à $ http.post (), etc. et toujours obtenir le résultat souhaité.
En outre, la réponse la mieux notée repose sur l'inclusion de jQuery complet dans la page pour la fonction $ .param (), alors que ma solution est agnostique jQuery, prête pour AngularJS pure.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
J'espère que cela t'aides.
la source
ASP.NET
ne supportait pas «nativement». Si vous ne voulez pas changer le comportement d'AngularJS (ce que je n'ai pas fait, parce que mon API retourne JSON, pourquoi ne pas l'accepter aussi, c'est plus flexible que les données de formulaire), vous pouvez lire dans leRequest.InputStream
puis le gérer de toute façon tu le veux. (J'ai choisi de le désérialiserdynamic
pour plus de facilité d'utilisation.)J'ai pris quelques autres réponses et fait quelque chose d'un peu plus propre, mettez cet
.config()
appel à la fin de votre module angulaire dans votre app.js:la source
unshift()
afin que les autres transformations ne soient pas perturbées. Bon travail.Depuis AngularJS v1.4.0, il existe un service intégré
$httpParamSerializer
qui convertit tout objet en une partie d'une demande HTTP selon les règles répertoriées sur la page des documents .Il peut être utilisé comme ceci:
N'oubliez pas que pour un message de formulaire correct, l'en-
Content-Type
tête doit être modifié. Pour le faire globalement pour toutes les requêtes POST, ce code (extrait de la demi-réponse d'Albireo) peut être utilisé:Pour ce faire uniquement pour le message actuel, la
headers
propriété de l'objet de demande doit être modifiée:la source
transformRequest: $httpParamSerializer, data: formDataObj
. Merci pour la solution.Vous pouvez définir le comportement globalement:
Vous n'avez donc pas à le redéfinir à chaque fois:
la source
Comme solution de contournement, vous pouvez simplement faire en sorte que le code recevant le POST réponde aux données d'application / json. Pour PHP, j'ai ajouté le code ci-dessous, ce qui me permet de le poster en format codé ou JSON.
la source
Ces réponses ressemblent à une folie excessive, parfois, simple est juste mieux:
la source
Content-Type
et le définir surapplication/x-www-form-urlencoded
.Vous pouvez essayer avec la solution ci-dessous
la source
Créez un service d'adaptateur pour la publication:
Utilisez-le dans vos contrôleurs ou autre:
la source
Il y a un tutoriel vraiment sympa qui passe en revue cela et d'autres choses connexes - Soumettre des formulaires AJAX: La manière AngularJS .
Fondamentalement, vous devez définir l'en-tête de la demande POST pour indiquer que vous envoyez des données de formulaire sous forme de chaîne codée URL et définir les données à envoyer au même format
Notez que la fonction d'assistance param () de jQuery est utilisée ici pour sérialiser les données dans une chaîne, mais vous pouvez également le faire manuellement si vous n'utilisez pas jQuery.
la source
$.param
faire la magie. solution parfaite pour ceux qui ont une application basée sur jQuery + AngularJS.Veuillez vérifier s'il vous plait! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
la source
Pour les utilisateurs de Symfony2:
Si vous ne voulez rien changer dans votre javascript pour que cela fonctionne, vous pouvez effectuer ces modifications dans votre application symfony:
Créez une classe qui étend la classe Symfony \ Component \ HttpFoundation \ Request:
Utilisez maintenant votre classe dans app_dev.php (ou tout fichier d'index que vous utilisez)
la source
Définir simplement Content-Type ne suffit pas, encoder les données du formulaire avant d'envoyer
$http.post(url, jQuery.param(data))
la source
J'utilise actuellement la solution suivante que j'ai trouvée dans le groupe Google AngularJS.
Notez que si vous utilisez PHP, vous devrez utiliser quelque chose comme le composant HTTP Symfony 2
Request::createFromGlobals()
pour lire ceci, car $ _POST ne sera pas automatiquement chargé avec.la source
AngularJS le fait correctement car il fait le type de contenu suivant dans l'en-tête de requête http:
Si vous utilisez php comme moi, ou même avec Symfony2, vous pouvez simplement étendre la compatibilité de votre serveur pour la norme json comme décrit ici: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html
La manière Symfony2 (par exemple à l'intérieur de votre DefaultController):
L'avantage serait que vous n'avez pas besoin d'utiliser param jQuery et que vous pouvez utiliser AngularJS sa façon native de faire de telles requêtes.
la source
Réponse complète (depuis angulaire 1.4). Vous devez inclure la dépendance $ httpParamSerializer
la source
Dans la configuration de votre application -
Avec votre demande de ressources -
la source
Ce n'est pas une réponse directe, mais plutôt une direction de conception légèrement différente:
Ne publiez pas les données sous forme de formulaire, mais en tant qu'objet JSON à mapper directement sur un objet côté serveur, ou utilisez la variable de chemin de style REST
Maintenant, je sais qu'aucune des options ne pourrait convenir dans votre cas puisque vous essayez de passer une clé XSRF. Le mapper dans une variable de chemin comme celle-ci est une conception terrible:
Parce que par nature, vous voudriez également passer la clé xsrf à un autre chemin
/login
,/book-appointment
etc., et vous ne voulez pas salir votre jolie URLIl est intéressant de l'ajouter en tant que champ d'objet n'est pas approprié non plus, car maintenant sur chaque objet json que vous passez au serveur, vous devez ajouter le champ
Vous ne voulez certainement pas ajouter un autre champ sur votre classe côté serveur qui n'a pas d'association sémantique directe avec l'objet domaine.
À mon avis, la meilleure façon de transmettre votre clé xsrf est via un en-tête HTTP. De nombreuses bibliothèques de frameworks Web côté serveur de protection xsrf le prennent en charge. Par exemple, dans Java Spring, vous pouvez le passer en utilisant l'en-
X-CSRF-TOKEN
tête .L'excellente capacité d'Angular de lier un objet JS à un objet d'interface utilisateur signifie que nous pouvons nous débarrasser de la pratique de publier le formulaire tous ensemble et de publier JSON à la place. JSON peut être facilement désérialisé en objet côté serveur et prend en charge des structures de données complexes telles que la carte, les tableaux, les objets imbriqués, etc.
Comment publier un tableau dans une charge utile de formulaire? Peut-être comme ça:
ou ca:
Les deux sont de mauvaise conception ..
la source
C'est ce que je fais pour mon besoin, où je dois envoyer les données de connexion à l'API en tant que données de formulaire et l'objet Javascript (userData) est converti automatiquement en données encodées URL
Voici comment mes données utilisateur sont
la source
La seule mince que vous devez changer est d'utiliser la propriété "params" plutôt que "data" lorsque vous créez votre objet $ http:
Dans l'exemple ci-dessus, les clients [i] ne sont que des objets JSON (en aucun cas sérialisés). Si vous utilisez "params" plutôt que "data" angular va sérialiser l'objet pour vous en utilisant $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
la source
Utilisez le
$http
service AngularJS et utilisez sapost
méthode ou sa$http
fonction de configuration .la source