Kaip siųsti duomenis kaip formos duomenis vietoj prašymo apkrovos?

Toliau pateiktame kode „AngularJS $http metodas skambina URL ir siunčia xsrf objektą kaip „Prašymo apkrova“ (kaip aprašyta „Chrome“ derinimo tinklo skirtuke). „JQuery $.ajax atlieka tą patį skambutį, bet perduoda xsrf kaip „formos duomenis“.

Kaip priversti „AngularJS“ išsiųsti xsrf kaip formos duomenis vietoj užklausos apkrovos?

 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() {} }); 
486
12 июля '12 в 1:44 2012-07-12 01:44 mjibsonas yra nustatytas liepos 12 d . 12 val. 1:44 2012-07-12 01:44
ответ 21 atsakymas

Toliau pateikta eilutė turėtų būti pridedama prie perkeliamo $ http objekto:

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

Ir perduoti duomenys turi būti konvertuojami į eilutę, užkoduotą URL:

 > $.param({fkey: "key"}) 'fkey=key' 

Taigi, turite kažką panašaus:

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

Nuo: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ

584
12 июля '12 в 2:31 2012-07-12 02:31 Atsakymą duoda mjibsonas liepos 12 d., 12 val

Jei nenorite naudoti jQuery sprendime, galite tai išbandyti. Sprendimą priima ngn-wiki.ru.site/questions/14302 / ...

 $http({ method: 'POST', url: url, 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: xsrf }).success(function () {}); 
189
14 февр. Atsakymas pateikiamas Anthony 14 vasario mėn 2013-02-14 09:04 '13, 9:04, 2013-02-14 09:04

Nuolatinis painiavos dėl šio klausimo paskatino mane parašyti apie tai dienoraštį. Sprendimas, kurį siūlau šiame pranešime, yra geresnis už jūsų dabartinį sprendimą su aukščiausiu įvertinimu, nes jis neapsiriboja tik duomenų objekto parametrų nustatymu $ http paslaugų skambučiams; tai yra, su mano sprendimu, galite tiesiog toliau perduoti faktinius duomenų objektus į $ http.post () ir tt ir vis tiek pasiekia norimą rezultatą.

Be to, didžiausias atsako lygis pagrįstas pilno jQuery įtraukimu į $ .param () funkcijos puslapį, o mano sprendimas yra jQuery agnostikas, grynas AngularJS.

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

Tikiuosi, kad tai padės.

91
21 дек. Atsakymą pateikė Ezekiel Victor 21 d. 2012-12-21 15:07 '12, 15:07 2012-12-21 15:07

Aš paėmiau keletą kitų atsakymų ir padariau kažką šiek tiek švaresnio, kai šį „ .config() skambutį įdėjau į „angular.module“ programą „app.js“:

 .config(['$httpProvider', function ($httpProvider) { // Intercept POST requests, convert to standard form encoding $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; $httpProvider.defaults.transformRequest.unshift(function (data, headersGetter) { var key, result = []; if (typeof data === "string") return data; for (key in data) { if (data.hasOwnProperty(key)) result.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key])); } return result.join(" }); }]); 
80
28 окт. atsakymas pateikiamas kzar 28 okt. 2013-10-28 14:39 '13, 14:39, 2013-10-28 14:39

Pagal „AngularJS v1.4.0“ yra įdiegta „ $httpParamSerializer paslauga, kuri konvertuoja bet kurį objektą į HTTP užklausos dalį pagal dokumentų puslapyje nustatytas taisykles.

Jis gali būti naudojamas taip:

 $http.post('http://example.com', $httpParamSerializer(formDataObj)). success(function(data){}). error(function(data){}); 

Atminkite, kad norint tinkamai užregistruoti formą, Content-Type antraštė turi būti pakeista. Jei norite tai padaryti visuose POST užklausose, šį kodą (iš „Albireo halfresonance“) galima naudoti:

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

Jei norite tai padaryti tik dabartiniam pranešimui, turite pakeisti užklausos objekto headers nuosavybę:

 var req = { method: 'POST', url: 'http://example.com', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: $httpParamSerializer(formDataObj) }; $http(req); 
55
01 июня '15 в 22:57 2015-06-01 22:57 atsakymas pateikiamas Mitja 01 birželio 15 d. 22:57 2015-06-01 22:57

Galite nustatyti elgesį visame pasaulyje:

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

Taigi jums nereikia kiekvieną kartą pakeisti jo:

 $http.post("/handle/post", { foo: "FOO", bar: "BAR" }).success(function (data, status, headers, config) { // TODO }).error(function (data, status, headers, config) { // TODO }); 
22
21 нояб. atsakymą pateikė „ Albireo“ 21 nov. 2012-11-21 12:32 '12 12:32 2012-11-21 12:32

Kaip problemos sprendimo būdą, galite tiesiog priversti kodą, gaunantį POST, atsakyti į taikomųjų programų / „Json“ duomenų. PHP, pridėjau žemiau esantį kodą, leidžiantį jį įkelti į formą arba JSON.

 //handles JSON posted arguments and stuffs them into $_POST //angular $http makes JSON posts (not normal "form encoded") $content_type_args = explode(';', $_SERVER['CONTENT_TYPE']); //parse content_type string if ($content_type_args[0] == 'application/json') $_POST = json_decode(file_get_contents('php://input'),true); //now continue to reference $_POST vars as usual 
20
09 нояб. James Bell atsakymas lapkričio 9 d. 2013-11-09 01:57 '13 ne 1:57 2013-11-09 01:57

Šie atsakymai atrodo kaip beprotiški, kartais paprasti:

 $http.post(loginUrl, "userName=" + encodeURIComponent(email) + " + encodeURIComponent(password) + " ).success(function (data) { //... 
15
24 марта '15 в 12:19 2015-03-24 12:19 atsakymą įteikė Serj Sagan kovo 15 d. 15 val. 12:19 2015-03-24 12:19

Galite pabandyti naudoti toliau pateiktą sprendimą.

 $http({ method: 'POST', url: url-post, data: data-post-object-json, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, transformRequest: function(obj) { var str = []; for (var key in obj) { if (obj[key] instanceof Array) { for(var idx in obj[key]){ var subObj = obj[key][idx]; for(var subKey in subObj){ str.push(encodeURIComponent(key) + "[" + idx + "][" + encodeURIComponent(subKey) + "]=" + encodeURIComponent(subObj[subKey])); } } } else { str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key])); } } return str.join(" } }).success(function(response) {  }); 
9
09 окт. atsakymas pateiktas tmquang6805 09 okt. 2013-10-09 14:00 '13 14:00 val. 2013-10-09 14:00

Yra labai gera pamoka, kurioje kalbama apie tai ir kitus susijusius dalykus - „ AJAX Forms: The AngularJS“ kelias .

Iš esmės, turite nustatyti POST užklausos antraštę, nurodydami, kad pateikiate formų duomenis kaip eilutę su URL kodavimu ir nurodote, kad duomenys turėtų būti siunčiami tuo pačiu formatu

 $http({ method : 'POST', url : 'url', data : $.param(xsrf), // pass in data as strings headers : { 'Content-Type': 'application/x-www-form-urlencoded' } // set the headers so angular passing info as form data (not request payload) }); 

Atkreipkite dėmesį, kad jQuery pagalbininko funkcija param () čia naudojama duomenims serializuoti į eilutę, bet taip pat galite tai padaryti rankiniu būdu, jei nenaudojate jQuery.

7
02 июля '14 в 15:33 2014-07-02 15:33 atsakymą pateikė robinmitra, liepos 2 d. 14, 15:33 2014-07-02 15:33

Sukurti pranešimo adapterio paslaugą:

 services.service('Http', function ($http) { var self = this this.post = function (url, data) { return $http({ method: 'POST', url: url, data: $.param(data), headers: {'Content-Type': 'application/x-www-form-urlencoded'} }) } }) 

Naudokite jį savo valdiklyje arba dar kitame:

 ctrls.controller('PersonCtrl', function (Http ) { var self = this self.user = {name: "Ozgur", eMail: null} self.register = function () { Http.post('/user/register', self.user).then(function (r) { //response console.log(r) }) } }) 
6
17 мая '16 в 2:41 2016-05-17 02:41 Atsakymą pateikė Ozgur GUL Gegužės 17 d., 16 d., 2:41, 2016-05-17 02:41
 var fd = new FormData(); fd.append('file', file); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined} }) .success(function(){ }) .error(function(){ }); 

Prašome patikrinti! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs

6
29 апр. atsakymas pateikiamas balandžio 29 d. 2015-04-29 13:14 '15, 13:14 pm 2015-04-29 13:14

Symfony2 naudotojams:

Jei nenorite ką nors pakeisti savo „JavaScript“ programoje, galite atlikti šiuos pakeitimus savo simfonijos programoje:

Sukurkite klasę, kuri praplečia simfoniją „Component“ „HttpFoundation“ užklausos klasė:

 <?php namespace Acme\Test\MyRequest; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\ParameterBag; class MyRequest extends Request{  public static function createFromGlobals() { // Get what we would get from the parent $request = parent::createFromGlobals(); // Add the handling for 'application/json' content type. if(0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/json')){ // The json is in the content $cont = $request->getContent(); $json = json_decode($cont); // ParameterBag must be an Array. if(is_object($json)) { $json = (array) $json; } $request->request = new ParameterBag($json); } return $request; } } 

Dabar naudokite programą „app_dev.php“ (arba bet kurį naudojamą indekso failą)

 // web/app_dev.php $kernel = new AppKernel('dev', true); // $kernel->loadClassCache(); $request = ForumBundleRequest::createFromGlobals(); // use your class instead // $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response); 
4
05 нояб. atsakymas, kurį pateikė Carmel 05 Nov. 2013-11-05 12:29 '13, 12:29, 2013-11-05 12:29

Vien tik nustatant turinio tipą nepakanka, prieš siunčiant URL kodo duomenis. $http.post(url, jQuery.param(data))

3
01 окт. atsakymas duotas Merlin Ran 01 spalis 2013-10-01 09:32 '13 ne 9:32 2013-10-01 09:32

Šiuo metu naudoju šį sprendimą „Google“ grupėje „AngularJS“.

 $ http .post ('/ echo / json /', 'json =' + encodeURIComponent (angular.toJson (duomenys)), { antraštės: { „Turinio tipas“: „taikymas / x-www-form-urlencoded;  charset = UTF-8 ' } }) sėkmė (funkcija (duomenys) { $ ulatus.data = duomenys; });

Pastaba: jei naudojate PHP, jums reikės naudoti kažką panašaus į HTTP komponentą Symfony 2 Request::createFromGlobals() kad perskaitytumėte, nes $ _POST su juo nebus automatiškai įkelta.

3
16 окт. Aditya spalio 16 d. Atsakymas 2013-10-16 02:02 '13, 02:02 2013-10-16 02:02

Visas atsakymas (su kampiniu 1.4). Turite įjungti $ httpParamSerializer priklausomybę

 var res = $resource(serverUrl + 'Token', { }, { save: { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } }); res.save({ }, $httpParamSerializer({ param1: 'sdsd', param2: 'sdsd' }), function (response) { }, function (error) { }); 
2
21 нояб. atsakymą pateikė Sebastián Rojas 21 nov. 2015-11-21 00:46 '15 - 0:46 2015-11-21 00:46

„AngularJS“ tai daro teisingai, nes „http“ užklausos antraštėje yra toks turinio tipas:

 Content-Type: application/json 

Jei einate su php, kaip ir aš, ar net su simfony2, galite tiesiog išplėsti savo suderinamumą su serveriu standartiniam „Json“, kaip aprašyta čia: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html

„Symfony2“ metodas (pvz., „DefaultController“):

 $request = $this->getRequest(); if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) { $data = json_decode($request->getContent(), true); $request->request->replace(is_array($data) ? $data : array()); } var_dump($request->request->all()); 

Privalumas būtų tas, kad jums nereikia naudoti „jQuery“ parametro ir galite naudoti „AngularJS“ savo būdą atlikti tokias užklausas.

2
22 июля '13 в 13:27 2013-07-22 13:27 Atsakymą davė Michaelas liepos 13 d. 13:27 2013-07-22 13:27

Programos konfigūracijoje -

 $httpProvider.defaults.transformRequest = function (data) { if (data === undefined) return data; var clonedData = $.extend(true, {}, data); for (var property in clonedData) if (property.substr(0, 1) == '$') delete clonedData[property]; return $.param(clonedData); }; 

Su išteklių užklausa -

  headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
1
14 июня '15 в 20:46 2015-06-14 20:46 atsakymas pateikiamas Vivekui birželio 14 d., 15 val. 20:46 2015-06-14 20:46

Tai nėra tiesioginis atsakymas, bet šiek tiek kitokia dizaino kryptis:

Nedėkite duomenų kaip formos, bet kaip JSON objektą tiesiogiai nukreipti į serverio objektą arba naudoti REST stiliaus kelio kintamąjį

Dabar žinau, kad jūsų atveju nėra tinkamos galimybės, nes bandote perkelti „XSRF“ raktą. Suderinimas su kintamu keliu, kaip šis, yra baisus dizainas:

 http://www.someexample.com/xsrf/{xsrfKey} 

Kadangi pagal savo pobūdį norėtumėte perduoti xsrf raktą į kitą kelią, /login , /book-appointment ir tt, ir nenorite sugadinti savo gražiojo URL

Įdomu tai, kad pridėti jį kaip objekto lauką taip pat netinka, nes dabar kiekviename iš „Json“ objektų, kuriuos einate į serverį, turite pridėti lauką

 { appointmentId : 23, name : 'Joe Citizen', xsrf : '...' } 

Žinoma, nenorite pridėti kito lauko į savo serverių klasę, kuri neturi tiesioginio semantinio ryšio su domeno objektu.

Mano nuomone, geriausias būdas perkelti savo xsrf raktą yra per HTTP antraštę. Jis palaiko xsrf daugialypės interneto saugos biblioteką. Pvz., „Java“ pavasarį galite jį nusiųsti naudojant „ X-CSRF-TOKEN .

Didelis „Angular“ sugebėjimas susieti JS objektą su vartotojo sąsajos objektu reiškia, kad mes galime atsikratyti formos kartu suformuoti ir įdėti JSON. JSON gali būti lengvai išrinktas į serverio objektą ir palaiko sudėtingas duomenų struktūras, pvz., Žemėlapius, matricas, įdėtus objektus ir kt.

Kaip siunčiate masyvą kaip naudingąją apkrovą? Gal tai patinka:

 shopLocation=downtown> 

arba tai:

 shopLocation=downtwon> 

Tiek blogas dizainas.

0
26 февр. atsakymas duotas gerrytan 26 vasaris 2015-02-26 14:37 '15, 14:37 2015-02-26 14:37

Vienintelis tonas, kurį reikia pakeisti, yra „params“ savybių, o ne „duomenų“ savybių naudojimas, kai sukuriate „$ http“ objektą:

 $http({ method: 'POST', url: serviceUrl + '/ClientUpdate', params: { > 

Pirmiau pateiktame pavyzdyje klientai [i] yra tik JSON objektas (nėra serializuotas jokiu būdu). Jei naudojate „params“, o ne „data“ kampinius, serializuokite objektą, naudodami $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer

-1
13 июля '15 в 19:05 2015-07-13 19:05 atsakymą pateikė Rafal Zajac liepos 15 d. 15 val

Naudokite „AngularJS $http ir naudokite jo post metodą arba konfigūruokite $http funkciją.

-3
30 дек. Atsakymą pateikė Shivang Gupta . 2014-12-30 12:28 '15, 12:28 2014-12-30 12:28

Kiti klausimai apie žymes arba Ask a question