AngularJS - Ar yra $ http.post būdas siųsti užklausos parametrus vietoj JSON?

Turiu seną kodą, kuris leidžia AJAX POST užklausą per jQuery įrašo metodą ir atrodo taip:

 $.post("/foo/bar", requestData, function(responseData) { //do stuff with response } 

requestData yra tik „JavaScript“ objektas su kai kuriomis pagrindinėmis eilutės ypatybėmis.

Dabar aš naudosiu kampinį ir norėčiau pakeisti šį kvietimą $ http.post. Aš atėjau:

 $http.post("/foo/bar", requestData).success( function(responseData) { //do stuff with response } }); 

Kai tai padariau, iš serverio gavau 500 klaidų atsakymų. Naudodamas „Firebug“ sužinojau, kad jis išsiuntė užklausos įstaigą taip:

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

Sėkmingas jQuery $.post siunčia kūną taip:

 param1=value1> 

Galutinis taškas, kurį spusteliu, laukia užklausos parametrų, o ne JSON. Taigi, mano klausimas yra vis dar pasakyti, kad „ $http.post siunčia „JavaScript“ objektą kaip užklausos parametrus vietoj JSON? Taip, aš žinau, kad aš galėčiau statyti eilutę iš objekto, bet aš noriu žinoti, ar „Angular“ tai suteikia nieko iš dėžutės.

112
30 авг. nustatė dnc253 30 rug . 2012-08-30 07:59 '12, 07:59 am 2012-08-30 07:59
@ 12 atsakymų

Manau, kad params konfigūracijos parametras čia neveiks, nes jis pridės eilutę į URL, o ne kūną, bet prideda tai, ką siūlo „Infeligo“, tai yra numatytojo pasaulinio transformavimo nepaisymo pavyzdys (naudojant jQuery param kaip pavyzdį, kaip konvertuoti duomenis į linija param).

Konfigūruokite pasaulio transformRequest funkciją:

 var app = angular.module('myApp'); app.config(function ($httpProvider) { $httpProvider.defaults.transformRequest = function(data){ if (data === undefined) { return data; } return $.param(data); } }); 

Taigi visi skambučiai į $ http.post automatiškai konvertuoja kūną į tą patį parametrų formatą, kurį naudoja skambutis jQuery $.post .

Atminkite, kad taip pat galite nustatyti turinio tipo antraštę kiekvienam skambučiui arba visame pasaulyje:

 $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; 

Ne globalinio transformavimo užklausos pavyzdys kiekvienam skambučiui:

  var transform = function(data){ return $.param(data); } $http.post("/foo/bar", requestData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, transformRequest: transform }).success(function(responseData) { //do stuff with response }); 
139
30 авг. atsakymas pateikiamas Gloopy 30 rug . 2012-08-30 10:07 '12 - 10:07 2012-08-30 10:07

Naudojant „ Angular“> = 1,4 , čia yra grynasis sprendimas, kurį radau, nesiremdamas jokiu pasirinkimu ar išoriniu:

 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'; }); 

Ir tada galite tai padaryti bet kurioje paraiškos vietoje:

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

Ir ji teisingai serializuos duomenis kaip param1=value1> ir atsiųs į /requesturl su pavadinimo application/x-www-form-urlencoded; charset=utf-8 application/x-www-form-urlencoded; charset=utf-8 Turinio tipas, kaip paprastai tikimasi su POST užklausomis galutiniuose taškuose.

19
18 мая '16 в 12:50 2016-05-18 12:50 atsakymas pateikiamas Saeb Amini gegužės 18, 16 d. 12:50 2016-05-18 12:50

„AngularJS“ dokumentuose:

params - {Object.} - Stringų ar objektų, kurie bus sukami, žemėlapis? key1 = reikšmė1 key2 = reikšmė2 po URL. Jei reikšmė nėra eilutė , ji bus JSONified.

Taigi, nurodykite eilutę kaip parametrus. Jei to nenorite, naudokite transformaciją. Vėlgi iš dokumentacijos:

Norėdami pakeisti šias transformacijas vietoje, nustatykite transformavimo funkcijas kaip configRefestest ir / arba transformResponse nuosavybės konfigūracijos objektą. Jei norite visuotinai panaikinti numatytuosius pakeitimus, nepakeiskite $ httpProvider.defaults.transformRequest ir $ httpProvider.defaults.transformResponse iš $ HttpProvider nuosavybės.

Daugiau informacijos žr.

17
30 авг. atsakymas pateikiamas Infeligo 30 d. 2012-08-30 09:36 '12, 09:36 am 2012-08-30 09:36

Naudokite „jQuery $.param kad $.param JSON duomenis į requestData.

Trumpai tariant, naudojant panašų kodą, kaip jūsų:

 $http.post("/foo/bar", $.param(requestData), { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } } ).success( function(responseData) { //do stuff with response } }); 

Norėdami tai padaryti, savo puslapyje kartu su „AngularJS“ turite įtraukti jQuery.

15
23 апр. Sagar Bhosale paskelbė balandžio 23 d 2013-04-23 20:27 '13, 20:27, 2013-04-23 20:27

Atkreipkite dėmesį, kad su kampiniu 1.4 galima formuoti duomenis be jQuery.

Programoje app.js:

 module.run(function($http, $httpParamSerializerJQLike) { $http.defaults.transformRequest.unshift($httpParamSerializerJQLike); }); 

Tada valdiklyje:

 $http({ method: 'POST', url: myUrl', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: myData }); 
7
23 дек. Thomas Graziani atsakymas 23 d. 2015-12-23 22:31 '15, 10:31 pm 2015-12-23 22:31

Aš taip pat turiu problemų konfigūruojant priskirtą HTTP autentifikavimą, nes $ išteklių caches užklausą.

Norėdami tai padaryti, privalote perrašyti esamas antraštes.

 var transformRequest = function(data, headersGetter){ var headers = headersGetter(); headers['Authorization'] = 'WSSE profile="UsernameToken"'; headers['X-WSSE'] = 'UsernameToken ' + nonce headers['Content-Type'] = 'application/json'; }; return $resource( url, { }, { query: { method: 'POST', url: apiURL + '/profile', transformRequest: transformRequest, params: {userId: '@userId'} }, } ); 

Tikiuosi, kad galėčiau padėti kam nors. Tai užtruko man 3 dienas.

5
02 мая '13 в 7:25 2013-05-02 07:25 atsakymą pateikė Frank Marcelo 02 gegužės 13 d. 7:25 2013-05-02 07:25

Tai gali būti šiek tiek nulaužta, bet aš išvengiau problemos ir konvertuoju json į serverio pusės PHP POST masyvą:

 $_POST = json_decode(file_get_contents('php://input'), true); 
5
13 нояб. TimoSolo lapkričio 13 d. Atsakymas 2013-11-13 16:41 '13, 4:41 val. 2013-11-13 16:41

Keisti numatytuosius antraštes:

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

Tada naudokite jQuery $.param :

 var payload = $.param({key: value}); $http.post(targetURL, payload); 
4
30 нояб. atsakymas pateikiamas Zags, lapkričio 30 d. 2014-11-30 22:58 '14, 10:58 pm 2014-11-30 22:58
  .controller('pieChartController', ['$scope', '$http', '$httpParamSerializerJQLike', function($scope, $http, $httpParamSerializerJQLike) { var data = { TimeStamp : "2016-04-25 12:50:00" }; $http({ method: 'POST', url: 'serverutilizationreport', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: $httpParamSerializerJQLike(data), }).success(function () {}); } ]); 
3
04 мая '16 в 13:01 2016-05-04 13:01 atsakymą pateikė Rohit luthra 04 gegužės 16 d. 13:01 2016-05-04 13:01

Greitas konfigūravimas - tiems iš jūsų, kurie susiduria su problema, susijusią su visuotine transformRequest funkcijos konfigūracija, čia pateikiamas fragmentas, kuriuo noriu atsikratyti Cannot read property 'jquery' of undefined klaidos Cannot read property 'jquery' of undefined :

 $httpProvider.defaults.transformRequest = function(data) { return data != undefined ? $.param(data) : null; } 
2
21 янв. atsakymas pateikiamas kshep92 sausio 21 d 2013-01-21 03:43 '13, 3:43, 2013-01-21 03:43

Šią problemą taip pat galite išspręsti nekeičiant serverio kodo, pakeiskite antraštę $http.post skambutyje ir reguliariai naudodami $_POST . Paaiškinimas pateiktas čia: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

1
12 февр. atsakymą pateikė vikramaditya234 , vasario 12 d. 2015-02-12 04:17 '15 at 4:17 2015-02-12 04:17

Daug kartų pastebėjau probleminį visų šių elgesį. Aš jį naudoju iš ekspreso (be rašymo) ir bodyParser (su tipo dt ~ kūno-analizatoriumi).

Aš ne bandžiau įkelti failą, o aš tiesiog aiškinau JSON, nurodytą pranešimo eilutėje.

request.body buvo tik tuščias siužetas ( {} ).

Po daugelio tyrimų, galiausiai, jis dirbo man:

 import { json } from 'body-parser'; ... app.use(json()); <-- should be defined before the first POST handler! 

Taip pat gali būti svarbu apibrėžti užklausos eilutėje esančio application/json turinio tipą iš kliento pusės.

0
02 сент. atsakymas pateikiamas peterh 02 sep . 2016-09-02 17:39 '16 at 17:39 pm 2016-09-02 17:39

Peržiūrėkite kitus klausimus apie „ žymas „ arba „ Užduoti klausimą“