J'ai un vieux code qui fait une requête AJAX POST via la méthode post de jQuery et ressemble à ceci:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
est juste un objet javascript avec quelques propriétés de chaîne de base.
Je suis en train de déplacer nos trucs pour utiliser Angular, et je veux remplacer cet appel par $ http.post. J'ai trouvé ce qui suit:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Quand j'ai fait cela, j'ai reçu une réponse d'erreur 500 du serveur. En utilisant Firebug, j'ai trouvé que cela envoyait le corps de la requête comme ceci:
{"param1":"value1","param2":"value2","param3":"value3"}
Le jQuery réussi $.post
envoie le corps comme ceci:
param1=value1¶m2=value2¶m3=value3
Le point de terminaison que je frappe attend des paramètres de demande et non JSON. Donc, ma question est: y a-t-il de toute façon à dire $http.post
d'envoyer l'objet javascript en tant que paramètres de requête au lieu de JSON? Oui, je sais que je pourrais construire la chaîne moi-même à partir de l'objet, mais je veux savoir si Angular fournit quelque chose pour cela hors de la boîte.
la source
$httpProvider.defaults
, cela ne fonctionne pas, un indice à ce sujet?Cannot read property "jquery" of undefined.
Comment résoudre ce problème? PS. Les transformations par appel fonctionnent.Si vous utilisez Angular> = 1.4 , voici la solution la plus propre que j'ai trouvée qui ne repose sur rien de personnalisé ou d'externe:
Et puis vous pouvez le faire n'importe où dans votre application:
Et il sérialisera correctement les données en tant que
param1=value1¶m2=value2
et les enverra/requesturl
avec l'enapplication/x-www-form-urlencoded; charset=utf-8
-tête Content-Type comme cela est normalement prévu avec les requêtes POST sur les points de terminaison.la source
De la documentation AngularJS:
Donc, fournissez une chaîne comme paramètres. Si vous ne le souhaitez pas, utilisez des transformations. Encore une fois, d'après la documentation:
Reportez-vous à la documentation pour plus de détails.
la source
Utilisez la
$.param
fonction de jQuery pour sérialiser les données JSON dans requestData.En bref, en utilisant un code similaire au vôtre:
Pour l'utiliser, vous devez inclure jQuery dans votre page avec AngularJS.
la source
Notez qu'à partir d'Angular 1.4, vous pouvez sérialiser les données du formulaire sans utiliser jQuery.
Dans l'app.js:
Puis dans votre contrôleur:
la source
Cela peut être un peu un hack, mais j'ai évité le problème et converti le json en tableau POST de PHP côté serveur:
la source
J'ai également des problèmes avec la configuration de l'authentification http personnalisée car $ resource cache la demande.
Pour que cela fonctionne, vous devez écraser les en-têtes existants en faisant ceci
J'espère avoir pu aider quelqu'un. Il m'a fallu 3 jours pour comprendre celui-ci.
la source
Modifiez les en-têtes par défaut:
Ensuite, utilisez la
$.param
méthode de JQuery :la source
la source
Réglage rapide - pour ceux d'entre vous qui ont des problèmes avec la configuration globale de la fonction transformRequest, voici l'extrait que j'utilise pour me débarrasser de l'
Cannot read property 'jquery' of undefined
erreur:la source
Vous pouvez également résoudre ce problème sans changer le code dans le serveur, changer l'en-tête dans l'
$http.post
appel et utiliser$_POST
la manière habituelle. Expliqué ici: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/la source
J'ai trouvé plusieurs fois le comportement problématique de cet ensemble. Je l'ai utilisé à partir d'express (sans typages) et du bodyParser (avec les typages dt ~ body-parser).
Je n'ai pas essayé de télécharger un fichier, mais simplement d'interpréter un JSON donné dans une chaîne de publication.
Le
request.body
était tout simplement un vide JSON ({}
).Après de nombreuses recherches, cela a finalement fonctionné pour moi:
Il peut également être important de donner le
application/json
type de contenu dans la chaîne de requête du côté client.la source
Syntaxe pour AngularJS v1.4.8 + (v1.5.0)
Par exemple:
la source