Quelqu'un pourrait-il me dire pourquoi la déclaration suivante n'envoie pas les données de publication à l'URL désignée? L'URL est appelée mais sur le serveur lorsque j'imprime $ _POST - j'obtiens un tableau vide. Si j'imprime un message dans la console avant de l'ajouter aux données, il affiche le contenu correct.
$http.post('request-url', { 'message' : message });
Je l'ai également essayé avec les données sous forme de chaîne (avec le même résultat):
$http.post('request-url', "message=" + message);
Il semble fonctionner lorsque je l'utilise dans le format suivant:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
mais existe-t-il un moyen de le faire avec $ http.post () - et dois-je toujours inclure l'en-tête pour que cela fonctionne? Je crois que le type de contenu ci-dessus spécifie le format des données envoyées, mais puis-je les envoyer en tant qu'objet javascript?
angularjs
post
angular-http
Spencer Mark
la source
la source
Réponses:
J'ai eu le même problème en utilisant asp.net MVC et j'ai trouvé la solution ici
Fonctionne comme un charme.
CODE
la source
bower install angular-post-fix --save-dev
pour l'ajouter.Ce n'est pas très clair ci-dessus, mais si vous recevez la demande en PHP, vous pouvez utiliser:
$params = json_decode(file_get_contents('php://input'),true);
Pour accéder à un tableau en PHP à partir d'un POST AngularJS.
la source
json_decode(file_get_contents('php://input'), true);
Vous pouvez définir le "Content-Type" par défaut comme ceci:
À propos du
data
format:Essayez d'utiliser cette variation
la source
J'ai eu un problème similaire, et je me demande si cela peut aussi être utile: https://stackoverflow.com/a/11443066
Cordialement,
la source
J'aime utiliser une fonction pour convertir des objets en paramètres de publication.
la source
Cela a finalement été résolu dans angular 1.4 en utilisant $ httpParamSerializerJQLike
Voir https://github.com/angular/angular.js/issues/6039
la source
J'utilise jQuery param avec AngularJS post requrest. Voici un exemple ... créer le module d'application AngularJS, où
myapp
est défini avecng-app
dans votre code HTML.Créons maintenant un contrôleur de connexion et un e-mail et un mot de passe POST.
Je n'aime pas expliquer le code, il est assez simple à comprendre :) Notez que cela
param
vient de jQuery, vous devez donc installer à la fois jQuery et AngularJS pour le faire fonctionner. Voici une capture d'écran.J'espère que cela vous sera utile. Merci!
la source
J'ai eu le même problème avec AngularJS et Node.js + Express 4 + Router
Le routeur attend les données de la demande du message dans le corps. Ce corps était toujours vide si je suivais l'exemple de Angular Docs
Notation 1
Mais si je l'ai utilisé dans les données
Notation 2
Modifier 1:
Sinon, le routeur node.js attendra les données dans req.body si utilisé la notation 1:
Qui envoie également les informations sous forme de charge utile JSON. C'est mieux dans certains cas où vous avez des tableaux dans votre json et x-www-form-urlencoded donnera quelques problèmes.
ça a marché. J'espère que ça aide.
la source
Contrairement à JQuery et pour des raisons de pédanterie, Angular utilise le format JSON pour le transfert de données POST d'un client vers le serveur (JQuery applique x-www-form-urlencoded vraisemblablement, bien que JQuery et Angular utilise JSON pour l'imputation de données). Il y a donc deux parties de problème: dans la partie client js et dans la partie serveur. Il vous faut donc:
mettre la partie client js Angular comme ceci:
ET
écrivez dans votre partie serveur pour recevoir des données d'un client (si c'est php).
Remarque: $ _POST ne fonctionnera pas!
La solution fonctionne bien pour moi, je l'espère, et pour vous.
la source
Pour envoyer des données via la méthode Post avec
$http
angularjs, vous devez modifierdata: "message=" + message
, avecdata: $.param({message:message})
la source
Pour s'appuyer sur la réponse de @ felipe-miosso:
Ajoutez-le à votre application:
la source
Je n'ai pas la réputation de commenter, mais en réponse / ajout à la réponse de Don F:
$params = json_decode(file_get_contents('php://input'));
Un deuxième paramètre de
true
doit être ajouté à lajson_decode
fonction afin de renvoyer correctement un tableau associatif:$params = json_decode(file_get_contents('php://input'), true);
la source
Angulaire
WebAPI 2
la source
Ce code a résolu le problème pour moi. Il s'agit d'une solution au niveau de l'application:
la source
Ajoutez ceci dans votre fichier js:
et ajoutez ceci à votre fichier serveur:
Cela devrait fonctionner.
la source
J'ai également fait face à un problème similaire et je faisais quelque chose comme ça et cela n'a pas fonctionné. Mon contrôleur Spring n'a pas pu lire le paramètre de données.
Mais en lisant ce forum et l'API Doc, j'ai essayé de suivre la voie et cela a fonctionné pour moi. Si quelqu'un a également un problème similaire, vous pouvez également essayer ci-dessous.
Veuillez consulter https://docs.angularjs.org/api/ng/service/ $ http # post pour savoir ce que fait la configuration param. {data: '"id": "1"'} - Carte des chaînes ou des objets qui seront convertis en URL? data = "id: 1"
la source
c'est probablement une réponse tardive mais je pense que la façon la plus appropriée est d'utiliser le même morceau de code pour une utilisation angulaire lors d'une requête "get", vous
$httpParamSerializer
devrez l'injecter à votre contrôleur afin que vous puissiez simplement faire ce qui suit sans avoir à utiliser Jquery du tout,$http.post(url,$httpParamSerializer({param:val}))
la source
Dans mon cas, je résous le problème comme ceci:
Vous devez utiliser JSON.stringify pour chaque paramètre contenant un objet JSON, puis créer votre objet de données avec "$ .param" :-)
NB: Mon "objJSON" est un objet JSON contenant un tableau, un entier, une chaîne et du contenu html. Sa taille totale est> 3500 caractères.
la source
Je sais qu'il a accepté la réponse. Mais, suivre pourrait aider les futurs lecteurs, si la réponse ne leur convient pas pour une raison quelconque.
Angular ne fait pas ajax comme jQuery. Pendant que j'essayais de suivre le guide pour modifier angulaire
$httpprovider
, j'ai rencontré d'autres problèmes. Par exemple, j'utilise codeigniter dans lequel la$this->input->is_ajax_request()
fonction échouait toujours (qui a été écrite par un autre programmeur et utilisée globalement, donc je ne peux pas changer) en disant que ce n'était pas une vraie demande ajax.Pour le résoudre, j'ai pris l'aide d'une promesse différée . Je l'ai testé dans Firefox, ie9 et cela a fonctionné.
J'ai la fonction suivante définie en dehors de tout code angulaire. Cette fonction effectue un appel jquery ajax régulier et renvoie un objet différé / promis (j'apprends toujours).
Ensuite, je l'appelle du code angulaire en utilisant le code suivant. Veuillez noter que nous devons mettre à jour
$scope
manuellement à l'aide de$scope.$apply()
.Ce n'est peut-être pas la réponse parfaite, mais cela m'a permis d'utiliser des appels jquery ajax avec angular et m'a permis de mettre à jour le
$scope
.la source
J'ai eu le même problème en express .. pour résoudre, vous devez utiliser bodyparser pour analyser les objets json avant d'envoyer des requêtes http ..
la source
J'espère que ça aide.
la source
Je n'ai pas trouvé d'extrait de code complet expliquant comment utiliser la méthode $ http.post pour envoyer des données au serveur et pourquoi cela ne fonctionnait pas dans ce cas.
Explications de l'extrait de code ci-dessous ...
Définition du Content-Type dans la variable de configuration qui sera transmise avec la demande de angularJS $ http.post qui indique au serveur que nous envoyons les données au format www post.
Remarquez la méthode $ htttp.post, où j'envoie le 1er paramètre comme URL, le 2ème paramètre comme données (sérialisées) et le 3ème paramètre comme config.
Le code restant est auto-compris.
Regardez l'exemple de code de la méthode $ http.post ici .
la source
Si vous utilisez PHP, c'est un moyen facile d'accéder à un tableau en PHP à partir d'un POST AngularJS.
la source
Si vous utilisez Angular> = 1.4 , voici la solution la plus propre utilisant le sérialiseur fourni par Angular :
Et vous pouvez simplement le faire n'importe où dans votre application:
Et il sérialisera correctement les données
param1=value1¶m2=value2
et les enverra/requesturl
avec leapplication/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.TL; DR
Au cours de mes recherches, j'ai trouvé que la réponse à ce problème se présente sous de nombreuses saveurs différentes; certains sont très compliqués et dépendent de fonctions personnalisées, certains dépendent de jQuery et et certains sont incomplets en suggérant que vous avez seulement besoin de définir l'en-tête.
Si vous venez de définir l'en-
Content-Type
tête, le point final verra les données POST, mais elles ne seront pas au format standard car à moins que vous ne fournissiez une chaîne commedata
ou sérialisiez manuellement votre objet de données, elles seront toutes sérialisées en JSON par par défaut et peut être mal interprété au point de terminaison.Par exemple, si le sérialiseur correct n'a pas été défini dans l'exemple ci-dessus, il serait considéré dans le noeud final comme:
Et cela peut conduire à une analyse inattendue, par exemple ASP.NET le traite comme un
null
nom de paramètre, avec{"param1":"value1","param2":"value2"}
comme valeur; ou Fiddler l'interprète dans l'autre sens, avec{"param1":"value1","param2":"value2"}
comme nom de paramètre etnull
comme valeur.la source
Similaire au format de travail suggéré par l'OP et à la réponse de Denison, sauf en utilisant
$http.post
au lieu de simplement$http
et dépend toujours de jQuery.La bonne chose à propos de l'utilisation de jQuery ici est que les objets complexes sont correctement passés; contre la conversion manuelle en paramètres d'URL qui peuvent brouiller les données.
la source
Quand j'ai eu ce problème, le paramètre que je publiais s'est avéré être un tableau d'objets au lieu d'un simple objet.
la source
Nous venons de mettre à jour angulaire 1.2 à 1.3, ont trouvé un problème dans le code. La transformation d'une ressource entraînera une boucle sans fin à cause (je pense) de la promesse $ détenant à nouveau le même objet. Peut-être que cela aidera quelqu'un ...
Je pourrais résoudre ce problème en:
la source
J'utilise le code de réponse accepté (code de Felipe) depuis un certain temps et cela fonctionne très bien (merci, Felipe!).
Cependant, récemment, j'ai découvert qu'il avait des problèmes avec des objets ou des tableaux vides. Par exemple, lors de la soumission de cet objet:
PHP ne semble pas du tout voir B et C. Il obtient ceci:
Un regard sur la demande réelle dans Chrome montre ceci:
J'ai écrit un extrait de code alternatif. Il semble bien fonctionner avec mes cas d'utilisation, mais je ne l'ai pas testé de manière approfondie, donc utilisez-le avec prudence.
J'ai utilisé TypeScript parce que j'aime le typage fort mais il serait facile de le convertir en JS pur:
Il est moins efficace que le code de Felipe mais je ne pense pas que cela ait beaucoup d'importance car il devrait être immédiat par rapport à la surcharge globale de la requête HTTP elle-même.
Maintenant PHP montre:
Pour autant que je sache, il n'est pas possible d'obtenir PHP pour reconnaître que Ba et C sont des tableaux vides, mais au moins les clés apparaissent, ce qui est important lorsqu'il y a du code qui s'appuie sur une certaine structure même lorsqu'il est essentiellement vide à l'intérieur.
Notez également qu'il convertit les s non définis et les s null en chaînes vides.
la source
Mettez simplement les données que vous souhaitez envoyer comme deuxième paramètre:
Une autre forme qui fonctionne également est:
Assurez-vous que cela
paramName
correspond exactement au nom du paramètre de la fonction que vous appelez.Source: AngularJS post shortcut method
la source
J'ai résolu cela par les codes ci-dessous:
Côté client (Js):
notez que les données sont un objet.
Sur le serveur (ASP.NET MVC):
et 'AllowCrossSiteJsonAttribute' est nécessaire pour les demandes interdomaines:
J'espère que cela a été utile.
la source