IT-Swarm.Net

AngularJs $ http.post () ne šalje podatke

Može li mi netko reći zašto sljedeća izjava ne šalje podatke o postu na navedeni url? URL se zove, ali na poslužitelju kad ispisujem $ _POST - dobivam prazan niz. Ako ispisujem poruku na konzoli prije nego što je dodam podacima - ona pokazuje točan sadržaj.

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

Pokušao sam ga i s podacima kao niz (s istim ishodom):

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

Čini se da djeluje kada ga koristim u sljedećem formatu:

$http({
    method: 'POST',
    url: 'request-url',
    data: "message=" + message,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});

ali postoji li način da se to učini s $ http.post () - i moram li uvijek uključivati ​​zaglavlje da bi moglo djelovati? Vjerujem da gornja vrsta sadržaja određuje format poslanih podataka, ali mogu li ga poslati kao JavaScript objekt?

331
Spencer Mark

Imao sam isti problem koristeći asp.net MVC i rješenje sam ovdje pronašao

Među pridošlicama postoji velika zbrka u vezi sa AngularJS zašto se funkcije kratice za uslugu $http ($http.post() itd.) Ne mogu zamijeniti s jQuery ekvivalenti (jQuery.post() itd.)

Razlika je u tome kako jQuery i AngularJS serializiraju i prenose podatke. U osnovi, problem je u tome što vaš odabrani jezik poslužitelja nije u stanju razumjeti izvorni prijenos AngularJS-a ... Prema zadanim postavkama jQuery prenosi podatke koristeći

Content-Type: x-www-form-urlencoded

i poznatu seriju foo=bar&baz=moe.

AngularJS , međutim, prenosi podatke koristeći

Content-Type: application/json 

i { "foo": "bar", "baz": "moe" }

JSON serializacija, koja nažalost neki jezici web poslužitelja - PHP - ne izvorno seserializiraju.

Djeluje poput šarma.

KODIRATI

// 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;
  }];
});
341
Felipe Miosso

Gore nije super jasno, ali ako primite zahtjev u PHP možete koristiti:

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

Za pristup nizu u PHP iz AngularJS POST.

113
Don F

Možete postaviti zadani "Vrsta sadržaja" ovako:

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

O formatu data:

Metode $ http.post i $ http.put prihvaćaju bilo koju vrijednost JavaScript objekta (ili niza) kao svoj podatkovni parametar. Ako su podaci JavaScript objekt, oni će se prema zadanim postavkama pretvoriti u JSON niz.

Pokušajte upotrijebiti ovu varijaciju

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

Imao sam sličan problem i zanima me može li ovo biti korisno: https://stackoverflow.com/a/11443066

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

Pozdrav,

56
ericson.cepeda

Volim koristiti funkciju za pretvaranje predmeta u postavljanje parama.

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

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

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

Konačno je riješeno u kutu 1.4 koristeći $ httpParamSerializerJQLike

Pogledajte https://github.com/angular/angular.js/isissue/6039

.controller('myCtrl', function($http, $httpParamSerializerJQLike) {
$http({
  method: 'POST',
  url: baseUrl,
  data: $httpParamSerializerJQLike({
    "user":{
      "email":"wahxxx@gmail.com",
      "password":"123456"
    }
  }),
  headers:
    'Content-Type': 'application/x-www-form-urlencoded'
})})
30
Stetzon

Koristim jQuery param s AngularJS post requrest. Evo primjera ... stvorite AngularJS aplikacijski modul, gdje je myapp definiran sa ng-app u vašem HTML kodu.

var app = angular.module('myapp', []);

Sada ćemo stvoriti kontroler za prijavu te POST e-poštu i zaporku.

app.controller('LoginController', ['$scope', '$http', function ($scope, $http) {
    // default post header
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    // send login data
    $http({
        method: 'POST',
        url: 'https://example.com/user/login',
        data: $.param({
            email: $scope.email,
            password: $scope.password
        }),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (data, status, headers, config) {
        // handle success things
    }).error(function (data, status, headers, config) {
        // handle error things
    });
}]);

Ne volim objašnjavati kôd, dovoljno je jednostavno razumjeti :) Imajte na umu da je param iz jQuery, tako da morate instalirati i jQuery i AngularJS da bi radili. Evo snimke zaslona.

enter image description here

Nadam se da je ovo korisno. Hvala!

17
Madan Sapkota

Imao sam isti problem s AngularJS i Node.js + Express 4 + Router

Ruter očekuje podatke od posta postava u tijelu. To je tijelo uvijek bilo prazno ako sam slijedio primjer iz Angular Dokumenata

Napomena 1

$http.post('/someUrl', {msg:'hello Word!'})

Ali ako bih ga koristio u podacima

Napomena 2

$http({
       withCredentials: false,
       method: 'post',
       url: yourUrl,
       headers: {'Content-Type': 'application/x-www-form-urlencoded'},
       data: postData
 });

Uredi 1:

Inače usmjerivač node.js očekuje podatke u req.body ako koristi oznaku 1:

req.body.msg

Koji podaci također šalju kao JSON korisni teret. To je bolje u nekim slučajevima kada imate nizove u vašem json-u, a x-www-form-urlencoded će stvoriti neke probleme.

upalilo je. Nadam se da pomaže.

10
alknows

Za razliku od JQueryja i radi pedantnosti, Angular koristi JSON format za POST podatke prijenos s klijenta na poslužitelj (JQuery vjerojatno pretpostavlja x-www-form-urlencoded, iako JQuery i Angular koristi JSON za unos podataka). Stoga postoje dva dijela problema: u dijelu js klijenta i u dijelu vašeg poslužitelja. Dakle, trebate:

  1. stavite js Angular klijenta poput ovog:

    $http({
    method: 'POST',
    url: 'request-url',
    data: {'message': 'Hello world'}
    });
    

I

  1. upišite u svoj poslužiteljski dio da biste primili podatke od klijenta (ako je php).

            $data               = file_get_contents("php://input");
            $dataJsonDecode     = json_decode($data);
            $message            = $dataJsonDecode->message;
            echo $message;     //'Hello world'
    

Napomena: $ _POST neće raditi!

Rješenje mi djeluje u redu, nadam se, i za vas.

9
Roman

Za slanje podataka putem Metode pošta s $http od angularjs morate promijeniti

data: "message=" + message, s data: $.param({message:message})

8

Da biste nadogradili na odgovor @ felipe-miosso:

  1. Preuzmite ga kao AngularJS modul iz ovdje ,
  2. Instalirajte ga
  3. Dodajte ga u aplikaciju:

    var app = angular.module('my_app', [ ... , 'httpPostFix']);
    
7
Renaud

Nemam ugled komentirati, ali kao odgovor/dodatak don F-ovog odgovora:

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

Drugi parametar true treba dodati funkciji json_decode da bi se pravilno vratio asocijativni niz:

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

6
Esten

Ovaj je kod mene riješio problem. To je rješenje na razini aplikacije:

moduleName.config(['$httpProvider',
  function($httpProvider) {
    $httpProvider.defaults.transformRequest.Push(function(data) {
        var requestStr;
        if (data) {
            data = JSON.parse(data);
            for (var key in data) {
                if (requestStr) {
                    requestStr += "&" + key + "=" + data[key];
                } else {
                    requestStr = key + "=" + data[key];
                }
            }
        }
        return requestStr;
    });
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
  }
]);
5
Spartak Lalaj

Dodajte to u svoju js datoteku:

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

i dodajte ovo u datoteku vašeg poslužitelja:

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

To bi trebalo raditi.

5
Jesus Erwin Suarez

ovo je vjerojatno kasni odgovor, ali mislim da je najprimjereniji način upotrebe istog dijela kutne uporabe kada obavljate "get" zahtjev koristeći vas $httpParamSerializer morat ćete ga ubrizgati u svoj kontroler, tako da jednostavno možete učiniti sljedeće, bez da morate uopće koristiti Jquery, $http.post(url,$httpParamSerializer({param:val}))

app.controller('ctrl',function($scope,$http,$httpParamSerializer){
    $http.post(url,$httpParamSerializer({param:val,secondParam:secondVal}));
}
4
oneLeggedChicken

U svom slučaju problem rješavam ovako:

var deferred = $q.defer();

$http({
    method: 'POST',
    url: 'myUri', 
    data: $.param({ param1: 'blablabla', param2: JSON.stringify(objJSON) }),
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(
    function(res) {
        console.log('succes !', res.data);
        deferred.resolve(res.data);
    },
    function(err) {
        console.log('error...', err);
        deferred.resolve(err);
    }
);
return deferred.promise;

Morate koristiti JSON.stringify za svaki param koji sadrži JSON objekt, a zatim sastaviti svoj podatkovni objekt s "$ .param" :-)

Napomena: Moj "objJSON" je JSON objekt koji sadrži niz, cijeli broj, niz i html sadržaj. Ukupna mu je veličina> 3500 znakova.

4
bArraxas

Također sam se suočio sa sličnim problemom i radio sam nešto takvo, a to nije uspjelo. Moj proljetni regulator nije uspio pročitati parametar podataka.

var paramsVal={data:'"id":"1"'};
  $http.post("Request URL",  {params: paramsVal});  

Ali čitajući ovaj forum i API Doc, pokušao sam slijedeći način i to mi je uspjelo. Ako neki također imaju sličan problem, pokušajte i ispod.

$http({
      method: 'POST',
      url: "Request URL",           
      params: paramsVal,
      headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
            });

Molimo provjerite https://docs.angularjs.org/api/ng/service/ $ http # post za ono što radi konfiguracija parama. {data: '"id": "1"'} - Karta nizova ili objekata koji će se pretvoriti u URL? data = "id: 1"

4
Viraj

Znam da je prihvatio odgovor. Ali praćenje bi moglo pomoći budućim čitateljima ako im odgovor iz bilo kojeg razloga ne odgovara.

Kutni ne radi ajax isto kao jQuery. Dok sam pokušavao slijediti vodič za izmjenu kutnog $httpprovider, naišao sam na druge probleme. Npr Koristim codeigniter u kojem funkcija $this->input->is_ajax_request() uvijek nije uspjela (što je napisao drugi programer i koristi se globalno, pa ne mogu promijeniti) rekavši da to nije pravi ajax zahtjev.

Da bih to riješio, uzeo sam pomoć odgođeno obećanje . Testirao sam ga u Firefoxu, tj. 9 i uspjelo je.

Imam sljedeću funkciju izvan bilo kojeg kutnog koda. Ova funkcija čini redoviti jquery ajax poziv i vraća odložen/obećan (još uvijek učim) objekt.

function getjQueryAjax(url, obj){
    return $.ajax({
        type: 'post',
        url: url,
        cache: true,
        data: obj
    });
}

Zatim ga nazivam kutnim kodom pomoću sljedećeg koda. Imajte na umu da moramo ažurirati $scope ručno pomoću $scope.$apply().

    var data = {
        media: "video",
        scope: "movies"
    };
    var rPromise = getjQueryAjax("myController/getMeTypes" , data);
    rPromise.success(function(response){
        console.log(response);
        $scope.$apply(function(){
            $scope.testData = JSON.parse(response);
            console.log($scope.testData);
        });
    }).error(function(){
        console.log("AJAX failed!");
    });

Ovo možda nije savršen odgovor, ali omogućilo mi je korištenje jquery ajax poziva s kutnim i dopuštalo mi je da ažuriram $scope.

3
Nis

Ako koristite kutni> = 1,4 , evo najčišćeg rješenja pomoću serijski alat koji pruža Angular :

angular.module('yourModule')
  .config(function ($httpProvider, $httpParamSerializerJQLikeProvider){
    $httpProvider.defaults.transformRequest.unshift($httpParamSerializerJQLikeProvider.$get());
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
});

A to možete jednostavno učiniti bilo gdje u vašoj aplikaciji:

$http({
  method: 'POST',
  url: '/requesturl',
  data: {
    param1: 'value1',
    param2: 'value2'
  }
});

I ispravno će serializirati podatke kao param1=value1&param2=value2 i poslati ih /requesturl s zaglavljem application/x-www-form-urlencoded; charset=utf-8 Content-Type kao što se obično očekuje s POST zahtjevima na krajnjim točkama.

TL-DR

Tijekom svog istraživanja utvrdio sam da odgovor na ovaj problem dolazi u mnogo različitih okusa; neke su vrlo zbunjene i ovise o prilagođenim funkcijama, neke ovise o jQueryju, a neke su nepotpune u prijedlogu da trebate postaviti samo zaglavlje.

Ako samo postavite zaglavlje Content-Type, krajnja točka vidjet će podatke POST, ali neće biti u standardnom formatu, jer osim ako ne navedete niz kao svoje dataname__, ili ručno serializirate objekt podataka, sve će se podrazumijevati serijski kao JSON i možda se pogrešno protumači u krajnjoj točki.

npr ako ispravni serializer nije postavljen u gornjem primjeru, na krajnjoj će se točki vidjeti kao:

{"param1":"value1","param2":"value2"}

A to može dovesti do neočekivanog raščlanjivanja, npr. ASP.NET tretira ga kao naziv parametra nullname__, s vrijednosti {"param1":"value1","param2":"value2"}; ili Fiddler to tumači na drugi način, s {"param1":"value1","param2":"value2"} kao imenom parametra, a nullkao vrijednost.

3
Saeb Amini

Ako koristite PHP ovo je jednostavan način za pristup nizu u PHP iz AngularJS POST.

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

Koristim asp.net WCF webservices s kutnim js i ispod koda:

 $http({
        contentType: "application/json; charset=utf-8",//required
        method: "POST",
        url: '../../operation/Service.svc/user_forget',
        dataType: "json",//optional
        data:{ "uid_or_phone": $scope.forgettel, "user_email": $scope.forgetemail },
        async: "isAsync"//optional

       }).success( function (response) {

         $scope.userforgeterror = response.d;                    
       })

Nadam se da pomaže.

3
Mehdi Rostami

Niste pronašli cjeloviti isječak koda kako koristiti $ http.post metod za slanje podataka na poslužitelj i zašto to ne radi u ovom slučaju.

Objašnjenja isječka koda ispod ...

  1. Koristim jQuery $ .param funkciju za serializiranje JSON podataka u www post podatke
  2. Postavljanje Content-Type-a u config varijabli koja će se proslijediti zajedno sa zahtjevom angularJS $ http.post koji upućuje poslužitelja da šaljemo podatke u www post formatu.

  3. Primijetite metodu $ htttp.post gdje ja šaljem 1. parametar kao url, 2. parametar kao podatke (serializiran) i treći parametar kao config.

Preostali kôd podrazumijeva se sam.

$scope.SendData = function () {
           // use $.param jQuery function to serialize data from JSON 
            var data = $.param({
                fName: $scope.firstName,
                lName: $scope.lastName
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post('/ServerRequest/PostDataResponse', data, config)
            .success(function (data, status, headers, config) {
                $scope.PostDataResponse = data;
            })
            .error(function (data, status, header, config) {
                $scope.ResponseDetails = "Data: " + data +
                    "<hr />status: " + status +
                    "<hr />headers: " + header +
                    "<hr />config: " + config;
            });
        };

Pogledajte primjer koda $ http.post metoda ovdje .

3
Sheo Narayan

Slično je i sa predloženim radnim formatom OP-a i Denisonovim odgovorom, osim što koristi $http.post umjesto samo $http i još uvijek ovisi o jQuery-ju.

Dobra stvar kod korištenja jQuery-a je da se složeni predmeti pravilno prolaze; protiv ručnog pretvaranja u parametre URL-a koji mogu prikupiti podatke.

$http.post( 'request-url', jQuery.param( { 'message': message } ), {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
3
Benjamin Intal

Imao sam isti problem u ekspresno .. da biste riješili morate koristiti bodyparser za raščlanjivanje json objekata prije slanja http zahtjeva ..

app.use(bodyParser.json());
3
msoliman

Upravo ažurirani s kutnih 1,2 na 1,3 pronašli su problem u kodu. Transformacija resursa dovest će do beskonačnog petlje jer (mislim da) $ obećanje opet drži isti objekt. Možda će to nekome pomoći ...

To bih mogao popraviti:

[...]
  /**
 * 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;

angular.forEach(obj, function(value, name) {
+    if(name.indexOf("$promise") != -1) {
+        return;
+    }

    value = obj[name];
    if (value instanceof Array) {
        for (i = 0; i < value.length; ++i) {
[...]
2
tom_w

Već neko vrijeme koristim šifru prihvaćenog odgovora (Felipe-ova šifra) i on odlično funkcionira (hvala, Felipe!).

No nedavno sam otkrio da ima problema s praznim objektima ili nizovima. Na primjer, prilikom slanja ovog objekta:

{
    A: 1,
    B: {
        a: [ ],
    },
    C: [ ],
    D: "2"
}

Izgleda da PHP uopće ne vidi B i C. Dobiva ovo:

[
    "A" => "1",
    "B" => "2"
]

Pogled na stvarni zahtjev u Chromeu pokazuje ovo:

A: 1
:
D: 2

Napisao sam alternativni isječak koda. Čini se da dobro funkcionira s mojim slučajevima uporabe, ali nisam to intenzivno testirao, pa koristite oprezno.

Koristio sam TypeScript jer volim snažno tipkanje, ali bilo bi lako pretvoriti u čisti JS:

angular.module("MyModule").config([ "$httpProvider", function($httpProvider: ng.IHttpProvider) {
    // Use x-www-form-urlencoded Content-Type
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";

    function phpize(obj: Object | any[], depth: number = 1): string[] {
        var arr: string[] = [ ];
        angular.forEach(obj, (value: any, key: string) => {
            if (angular.isObject(value) || angular.isArray(value)) {
                var arrInner: string[] = phpize(value, depth + 1);
                var tmpKey: string;
                var encodedKey = encodeURIComponent(key);
                if (depth == 1) tmpKey = encodedKey;
                else tmpKey = `[${encodedKey}]`;
                if (arrInner.length == 0) {
                    arr.Push(`${tmpKey}=`);
                }
                else {
                    arr = arr.concat(arrInner.map(inner => `${tmpKey}${inner}`));
                }
            }
            else {
                var encodedKey = encodeURIComponent(key);
                var encodedValue;
                if (angular.isUndefined(value) || value === null) encodedValue = "";
                else encodedValue = encodeURIComponent(value);

                if (depth == 1) {
                    arr.Push(`${encodedKey}=${encodedValue}`);
                }
                else {
                    arr.Push(`[${encodedKey}]=${encodedValue}`);
                }
            }
        });
        return arr;
    }

    // Override $http service's default transformRequest
    (<any>$httpProvider.defaults).transformRequest = [ function(data: any) {
        if (!angular.isObject(data) || data.toString() == "[object File]") return data;
        return phpize(data).join("&");
    } ];
} ]);

Manje je učinkovit od Felipeovog koda, ali mislim da to nije previše važno jer bi trebao biti neposredan u usporedbi s ukupnim nadzemnim dijelom samog HTTP zahtjeva.

Sada PHP pokazuje:

[
    "A" => "1",
    "B" => [
        "a" => ""
    ],
    "C" => "",
    "D" => "2"
]

Koliko znam nije moguće navesti PHP da prepozna da su Ba i C prazni nizovi, ali pojavljuju se barem tipke, što je važno kada postoji kôd koji se oslanja na određenu strukturu, čak i kad je u osnovi prazno iznutra.

Također imajte na umu da pretvara nedefinirano s i null s u prazne nizove.

2
obe

Kad sam imao ovog problema, parametar koji sam objavljivao pokazao se kao niz objekata umjesto jednostavnog objekta.

2
D. Kermott

Nije kutna krivnja. Angular dizajniran je za rad u JSON svijetu. Dakle, kada $ http usluga pošalje AJAX zahtjev, on šalje sve vaše podatke kao korisni teret, a ne kao oblik obrasca kako bi ih vaša sigurnosna aplikacija mogla obraditi. Ali jQuery neke stvari radi interno. Upućujete jQueryjev $ ajax modul da veže podatke obrasca kao JSON, ali prije nego što pošaljete AJAX zahtjev, on serializira JSON i dodate application/x-www-form-urlencoded zaglavlje. Na ovaj način vaša zamjenska aplikacija može primati podatke obrazaca u obliku parametara posta, a ne JSON.

Ali zadani ponašanje kutnog $ http usluge možete promijeniti

  1. Dodavanje zaglavlja
  2. Serijaliziranje json

$ httpParamSerializerJQLike je ugrađena usluga tvrtke angular koja na isti način serializira json $ .param kao i jQuery.

$http({
    method: 'POST',
    url: 'request-url',
    data: $httpParamSerializerJQLike(json-form-data),
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;'
    }
});

Ako vam je potreban dodatak za prvo serializiranje podataka oblika u JSON, upotrijebite ovaj https://github.com/marioizquierdo/jquery.serializeJSON

1
Uday Hiwarale

Samo kao podatke postavite podatke koje želite poslati:

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

Drugi oblik koji također djeluje je:

$http.post('request-url',  { params: { paramName: value } });

Provjerite da li paramName točno odgovara nazivu parametra funkcije koju zovete.

Izvor: metoda prečaca AngularJS

1
Marco Lackovic

To sam riješio sljedećim kodovima:

Klijentova strana (Js):

     $http({
                url: me.serverPath,
                method: 'POST',
                data: data,
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            }).
                success(function (serverData) {
                    console.log("ServerData:", serverData);
    ......

primijetite da su podaci objekt.

Na poslužitelju (ASP.NET MVC):

[AllowCrossSiteJson]
        public string Api()
        {
            var data = JsonConvert.DeserializeObject<AgentRequest>(Request.Form[0]);
            if (data == null) return "Null Request";
            var bl = Page.Bl = new Core(this);

            return data.methodName;
        }

i "AllowCrossSiteJsonAttribute" potreban je za zahtjeve više domena:

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnActionExecuting(filterContext);
        }
    }

Nadam se da je ovo bilo korisno.

1
pixparker

Napisao sam mali PHP pomoćna funkcija koji omogućava obje vrste ulaznih parametara:

function getArgs () {
    if ($input = file_get_contents('php://input') && $input_params = json_decode($input,true))
        return $input_params + $_POST + $_GET;
    return $_POST + $_GET;
}

Upotreba:

<?php
    include("util.php"); # above code
    $request = getArgs();

    $myVar = "";
    if (isset($request['myVar']))
        $myVar = $request['myVar'];
?>

Zbog toga nisu potrebne promjene vašeg JavaScript-a.

0
Craig Smedley

Imao sam ovaj problem, problem je bio u tome što nisam mogao dobiti podatke dok objavljujem koristeći gore spomenuto zaglavlje, tj.

headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded'
}

Dok smo koristili jquery Ajax, obično smo dobijali podatke u response.body na pomoćnom poslužitelju, ali dok implementiramo Angular ajax, podaci nisu stizali kao odgovor.

request.getParameterMap.keySet().iterator().next()
0
John Swain

Jednostavno rješenje pronašli smo na

http://jasonwatmore.com/post/2014/04/18/post-a-simple-string-value-from-angularjs-to-net-web-api

return $http.post(Config.apiUrl + '/example/processfile', '"' + fileName + '"');
0
NoloMokgosi

Upravo predlažem moderniziranu verziju @ odgovor FelipeMiosso :

.config(["$httpProvider", function ($httpProvider) {

  function buildKey(parentKey, subKey) {
    return parentKey + "[" + subKey + "]";
  }

  function buildObject(key, value) {
    var object = {};
    object[key] = value;
    return object;
  }

  function join(array) {
    return array.filter(function (entry) {
      return entry;
    }).join("&");
  }

  function arrayToQueryString(parentKey, array) {
    return join(array.map(function (value, subKey) {
      return toQueryString(buildObject(buildKey(parentKey, subKey), value));
    }));
  }

  function objectToQueryString(parentKey, object) {
    return join(Object.keys(object).map(function (subKey) {
      return toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]));
    }));
  }

  function toQueryString(input) {
    return join(Object.keys(input).map(function (key) {
      var value = input[key];
      if (value instanceof Array) {
        return arrayToQueryString(key, value);
      } else if (value instanceof Object) {
        return objectToQueryString(key, value);
      } else if (undefined !== value && null !== value) {
        return encodeURIComponent(key) + "=" + encodeURIComponent(value);
      } else {
        return "";
      }
    }));
  }

  function isQueryStringEligible(input) {
    return null !== input && "object" === typeof input && "[object File]" !== String(input);
  }

  var interceptor = [function () {
    return {
      request: function (config) {
        if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
          config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
          config.data = toQueryString(config.data);
        }
        return config;
      }
    };
  }];

  $httpProvider.interceptors.Push(interceptor);

}])

Verzija ES6:

.config(["$httpProvider", function ($httpProvider) {

  "use strict";

  const buildKey = (parentKey, subKey) => `${parentKey}[${subKey}]`;

  const buildObject = (key, value) => ({ [key]: value });

  const join = (array) => array.filter((entry) => entry).join("&");

  const arrayToQueryString = (parentKey, array) =>
    join(array.map((value, subKey) =>
      toQueryString(buildObject(buildKey(parentKey, subKey), value))));

  const objectToQueryString = (parentKey, object) =>
    join(Object.keys(object).map((subKey) =>
      toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]))));

  const toQueryString = (input) => join(Object.keys(input).map((key) => {
    const value = input[key];
    if (value instanceof Array) {
      return arrayToQueryString(key, value);
    } else if (value instanceof Object) {
      return objectToQueryString(key, value);
    } else if (undefined !== value && null !== value) {
      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
    } else {
      return "";
    }
  }));

  const isQueryStringEligible = (input) =>
    null !== input && "object" === typeof input && "[object File]" !== String(input);

  const interceptor = [() => ({
    request(config) {
      if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
        config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
        config.data = toQueryString(config.data);
      }
      return config;
    }
  })];

  $httpProvider.interceptors.Push(interceptor);

}])
0
sp00m

koristiti na ovaj način. nema potrebe pisati toliko

 isAuth = $http.post("Yr URL", {username: username, password: password});

a u nodejs stražnjem kraju

app.post("Yr URL",function(req,resp)
{

  var username = req.body.username||req.param('username');
  var password = req.body.password||req.param('password');
}

Nadam se da ovo pomaže

0
Siddharth

Korištenjem vrlo jednostavne metode možemo slijediti ovo:

 $http({
        url : "submit_form_adv.php",
        method : 'POST',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        transformRequest: function(obj) {
            var str = [];
            for(var p in obj)
                str.Push(encodeURIComponent(p)+' = '+encodeURIComponent(obj[p]));

            return str.join('&');
        },
        data : {sample_id : 100, sample_name: 'Abin John'},

    }).success(function(data, status, headers, config) {

    }).error(function(ata, status, headers, config) {

    });
0
Hari