338 votes

AngularJs $http.post() ne pas envoyer de données

Je suis en tirant mes cheveux - quelqu'un pourrait-il me dire pourquoi l'instruction suivante n'est pas d'envoyer des données post à l'url spécifiée? L'url est appelée, mais sur le serveur lors de l'impression d' $_POST - je obtenir un tableau vide. Si j'ai l'impression de message dans la console avant de l'ajouter aux données, il montre que le contenu approprié.

$http.post('request-url',  { 'message' : message });

J'ai aussi essayé avec les données en tant que chaîne de caractères (avec le même résultat):

$http.post('request-url',  "message=" + message);

Il semble fonctionner quand 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 est-il un moyen de le faire avec le $http.post() - et dois-je toujours inclure l'en-tête dans l'ordre pour que cela fonctionne? Je crois que ce type de contenu est de spécifier le format des données envoyées, mais je peux les envoyer comme objet javascript?

346voto

Felipe Miosso Points 2518

J'ai eu le même problème à l'aide de asp.net MVC. Trouvé la solution ici: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

Il y a beaucoup de confusion chez les nouveaux arrivants à AngularJS pourquoi l' $http service de la sténographie de fonctions ($http.post(), etc.) ne semblent pas remplaçables avec les équivalents jQuery (jQuery.post(), etc.)

La différence est dans la façon de jQuery et AngularJS sérialiser et transmettre les données. Fondamentalement, le problème est avec votre serveur de langue de le choix d'être incapable de comprendre AngularJS transmission nativement ... Par défaut, jQuery transmet les données à l'aide de Content-Type: x-www-form-urlencoded et le familier foo=bar&baz=moe de sérialisation. AngularJS, cependant, transmet les données à l'aide de Content-Type: application/json { "foo": "bar", "baz": "moe" } JSON la sérialisation, qui, malheureusement, certains serveur Web langues-notamment PHP-ne pas unserialize nativement.

Fonctionne comme un charme.

CODE

// Your app's root module...
angular.module('MyModule', [], function($httpProvider) {
  // Use x-www-form-urlencoded Content-Type
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

  /**
   * The workhorse; converts an object to x-www-form-urlencoded serialization.
   * @param {Object} obj
   * @return {String}
   */ 
  var param = function(obj) {
    var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

    for(name in obj) {
      value = obj[name];

      if(value instanceof Array) {
        for(i=0; i<value.length; ++i) {
          subValue = value[i];
          fullSubName = name + '[' + i + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value instanceof Object) {
        for(subName in value) {
          subValue = value[subName];
          fullSubName = name + '[' + subName + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value !== undefined && value !== null)
        query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
    }

    return query.length ? query.substr(0, query.length - 1) : query;
  };

  // Override $http service's default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
  }];
});

117voto

Don F Points 41

C'est pas super clair au-dessus, mais si vous êtes à la réception de la demande en PHP, vous devez utiliser:

$params = json_decode(file_get_contents('php://input'));

Pour accéder à un tableau en PHP à partir d'un AngularJS POST.

78voto

dluz Points 1821

Vous pouvez définir la valeur par défaut "Content-Type" comme ceci:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

À propos de l' data format:

L' $http.poste et $http.placez les méthodes d'accepter un objet JavaScript (ou une chaîne) valeur de leurs données de paramètre. Si des données est un objet JavaScript, il sera, par défaut, converti une chaîne JSON.

Essayez d'utiliser cette variation

function sendData($scope) {
 $http({
    url: 'request-url',
    method: "POST",
    data: { 'message' : message }
})
.then(function(response) {
        // success
    }, 
    function(response) { // optional
        // failed
    }
);

}

60voto

ericson.cepeda Points 126

J'ai eu un problème similaire, et je me demande si cela peut être utile: http://stackoverflow.com/a/11443066

var xsrf = $.param({fkey: "key"});
$http({
    method: 'POST',
    url: url,
    data: xsrf,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

En ce qui concerne,

34voto

Rômulo Collopy Points 21

J'aime utiliser une fonction de conversion d'objets en post params.

myobject = {'one':'1','two':'2','three':'3'}

Object.toparams = function ObjecttoParams(obj) {
    var p = [];
    for (var key in obj) {
        p.push(key + '=' + obj[key]);
    }
    return p.join('&');
};

$http({
    method: 'POST',
    url: url,
    data: Object.toparams(myobject),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X