Mam jakiś stary kod, który wykonuje żądanie AJAX POST za pośrednictwem metody postu jQuery i wygląda mniej więcej tak:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
jest po prostu obiektem javascript z kilkoma podstawowymi właściwościami ciągu.
Jestem w trakcie przenoszenia naszych rzeczy do użycia Angulara i chcę zastąpić to wywołanie $ http.post. Wymyśliłem co następuje:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Kiedy to zrobiłem, otrzymałem odpowiedź o błędzie 500 z serwera. Korzystając z Firebug, odkryłem, że wysłało to treść żądania w następujący sposób:
{"param1":"value1","param2":"value2","param3":"value3"}
Pomyślne jQuery $.post
wysyła treść w następujący sposób:
param1=value1¶m2=value2¶m3=value3
Punkt końcowy, do którego trafiam, oczekuje parametrów żądania, a nie formatu JSON. Tak więc moje pytanie brzmi: czy mimo to $http.post
należy wysłać obiekt javascript jako parametry żądania zamiast JSON? Tak, wiem, że mógłbym sam zbudować ciąg z obiektu, ale chcę wiedzieć, czy Angular zapewnia coś takiego po wyjęciu z pudełka.
źródło
$httpProvider.defaults
, to nie działa, jakieś wskazówki na ten temat?Cannot read property "jquery" of undefined.
Jak to naprawić? PS. Przekształcenia na żądanie działają.Jeśli używasz Angular> = 1.4 , oto najczystsze rozwiązanie, które znalazłem, które nie opiera się na niczym niestandardowym ani zewnętrznym:
Następnie możesz to zrobić w dowolnym miejscu aplikacji:
I będzie prawidłowo szeregować dane jak
param1=value1¶m2=value2
i wysłać go do/requesturl
zapplication/x-www-form-urlencoded; charset=utf-8
nagłówka Content-Type, jak to zwykle oczekuje wniosków post na punktach końcowych.źródło
Z dokumentacji AngularJS:
Więc podaj ciąg jako parametry. Jeśli tego nie chcesz, użyj transformacji. Ponownie z dokumentacji:
Więcej informacji można znaleźć w dokumentacji .
źródło
Użyj
$.param
funkcji jQuery, aby serializować dane JSON w requestData.Krótko mówiąc, używając podobnego kodu jak Twój:
Aby z tego skorzystać, musisz dołączyć jQuery na swojej stronie wraz z AngularJS.
źródło
Zwróć uwagę, że od wersji Angular 1.4 możesz serializować dane formularza bez używania jQuery.
W pliku app.js:
Następnie w kontrolerze:
źródło
To może być trochę hack, ale uniknąłem problemu i przekonwertowałem json na tablicę POST PHP po stronie serwera:
źródło
Mam również problemy z ustawieniem niestandardowego uwierzytelniania HTTP, ponieważ $ zasób buforuje żądanie.
Aby to zadziałało, musisz w ten sposób nadpisać istniejące nagłówki
Mam nadzieję, że udało mi się komuś pomóc. Zrozumienie tego zajęło mi 3 dni.
źródło
Zmodyfikuj domyślne nagłówki:
Następnie użyj
$.param
metody JQuery :źródło
źródło
Szybka regulacja - dla tych z Was, którzy mają problem z globalną konfiguracją funkcji transformRequest, oto fragment kodu, którego używam, aby pozbyć się
Cannot read property 'jquery' of undefined
błędu:źródło
Możesz również rozwiązać ten problem bez zmiany kodu na serwerze, zmiany nagłówka w
$http.post
wywołaniu i używania$_POST
zwykłego sposobu. Wyjaśniono tutaj: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/źródło
Wielokrotnie znajdowałem problematyczne zachowanie tej całości. Użyłem go z express (bez typów) i bodyParser (z typami dt ~ body-parser).
Nie próbowałem przesyłać pliku, zamiast tego po prostu zinterpretowałem JSON podany w ciągu postu.
request.body
Po prostu pusty json ({}
).Po wielu badaniach w końcu to zadziałało:
Ważne może być również podanie
application/json
typu zawartości w ciągu żądania po stronie klienta.źródło
Składnia dla AngularJS w wersji 1.4.8 + (w wersji 1.5.0)
Na przykład:
źródło