Czy ktoś mógłby mi powiedzieć, dlaczego poniższe oświadczenie nie wysyła danych do podanego adresu URL? Adres URL jest wywoływany, ale na serwerze, gdy drukuję $ _POST - dostaję pustą tablicę. Jeśli wydrukuję wiadomość w konsoli przed dodaniem jej do danych - pokazuje prawidłową treść.
$http.post('request-url', { 'message' : message });
Próbowałem również z danymi jako ciągiem znaków (z takim samym wynikiem):
$http.post('request-url', "message=" + message);
Wygląda na to, że działa, gdy używam go w następującym formacie:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
ale czy można to zrobić za pomocą $ http.post () - i czy zawsze muszę dołączać nagłówek, aby działał? Uważam, że powyższy typ zawartości określa format wysyłanych danych, ale czy mogę wysłać go jako obiekt javascript?
angularjs
post
angular-http
Spencer Mark
źródło
źródło
Odpowiedzi:
Miałem ten sam problem przy użyciu asp.net MVC i znalazłem rozwiązanie tutaj
Działa jak marzenie.
KOD
źródło
bower install angular-post-fix --save-dev
aby go dodać.Nie jest to zbyt jasne powyżej, ale jeśli otrzymujesz żądanie w PHP, możesz użyć:
$params = json_decode(file_get_contents('php://input'),true);
Aby uzyskać dostęp do tablicy w PHP z POST AngularJS.
źródło
json_decode(file_get_contents('php://input'), true);
Możesz ustawić domyślny „typ zawartości” w następujący sposób:
Informacje o
data
formacie:Spróbuj użyć tej odmiany
źródło
Miałem podobny problem i zastanawiam się, czy to też może być przydatne: https://stackoverflow.com/a/11443066
Pozdrowienia,
źródło
Lubię używać funkcji do konwersji obiektów na parametry postu.
źródło
Ten problem został w końcu rozwiązany w wersji kątowej 1.4 za pomocą $ httpParamSerializerJQLike
Zobacz https://github.com/angular/angular.js/issues/6039
źródło
Używam jQuery param z AngularJS post requrest. Oto przykład ... utwórz moduł aplikacji AngularJS, w którym
myapp
jest zdefiniowanyng-app
w kodzie HTML.Utwórzmy teraz kontroler logowania oraz adres e-mail i hasło POST.
Nie lubię tłumaczyć kodu, wystarczy go zrozumieć :) Zauważ, że
param
pochodzi z jQuery, więc musisz zainstalować zarówno jQuery, jak i AngularJS, aby działało. Oto zrzut ekranu.Mam nadzieję, że to jest pomocne. Dzięki!
źródło
Miałem ten sam problem z AngularJS i Node.js + Express 4 + Router
Router oczekuje danych od żądania postu w treści. To ciało było zawsze puste, gdybym podążał za przykładem z Angular Docs
Notacja 1
Ale jeśli użyłem tego w danych
Notacja 2
Edycja 1:
W przeciwnym razie router node.js będzie oczekiwał danych w body.qq, jeśli użyje notacji 1:
Co również wysyła informacje jako ładunek JSON. Jest to lepsze w niektórych przypadkach, gdy masz tablice w swoim jsonie i x-www-form-urlencoded spowoduje pewne problemy.
zadziałało. Mam nadzieję, że to pomoże.
źródło
W przeciwieństwie do JQuery i ze względu na pedanterię, Angular używa formatu JSON do przesyłania danych POST od klienta do serwera (JQuery przypuszczalnie stosuje x-www-form-urlencoded, chociaż JQuery i Angular używa JSON do imputacji danych). Dlatego istnieją dwie części problemu: w części klienta js i części serwera. Potrzebujesz więc:
umieść część klienta js Angular w ten sposób:
I
napisz w części serwerowej, aby otrzymać dane od klienta (jeśli jest to php).
Uwaga: $ _POST nie będzie działać!
Mam nadzieję, że rozwiązanie działa dobrze dla mnie i dla ciebie.
źródło
Aby przesyłać dane za pomocą
$http
metody Post z angularjs, musisz zmienićdata: "message=" + message
, zdata: $.param({message:message})
źródło
Aby skorzystać z odpowiedzi @ felipe-miosso:
Dodaj go do swojej aplikacji:
źródło
Nie mam reputacji do komentowania, ale w odpowiedzi / uzupełnieniu odpowiedzi Dona F:
$params = json_decode(file_get_contents('php://input'));
true
Dojson_decode
funkcji należy dodać drugi parametr , aby poprawnie zwrócić tablicę asocjacyjną:$params = json_decode(file_get_contents('php://input'), true);
źródło
Kątowy
WebAPI 2
źródło
Ten kod rozwiązał dla mnie problem. Jest to rozwiązanie na poziomie aplikacji:
źródło
Dodaj to do pliku js:
i dodaj to do pliku serwera:
To powinno działać.
źródło
Miałem również podobny problem i robiłem coś takiego, a to nie działało. Mój kontroler Spring nie mógł odczytać parametru danych.
Ale czytając to forum i dokumentację API, próbowałem postępować w ten sposób i to działało dla mnie. Jeśli ktoś ma podobny problem, możesz spróbować również poniżej.
Sprawdź https://docs.angularjs.org/api/ng/service/ $ http # post, aby dowiedzieć się, co robi konfiguracja parametrów. {data: '"id": "1"'} - Mapa ciągów znaków lub obiektów, które zostaną zamienione na URL? data = "id: 1"
źródło
jest to prawdopodobnie późna odpowiedź, ale myślę, że najbardziej właściwym sposobem jest użycie tego samego fragmentu kodu pod kątem podczas wykonywania żądania „get” za pomocą,
$httpParamSerializer
będziesz musiał wstrzyknąć go do kontrolera, abyś mógł wykonać następujące czynności bez konieczności w ogóle używaj Jquery,$http.post(url,$httpParamSerializer({param:val}))
źródło
W moim przypadku rozwiązuję problem w następujący sposób:
Musisz użyć JSON.stringify dla każdego parametru zawierającego obiekt JSON, a następnie zbuduj obiekt danych za pomocą „$ .param” :-)
NB: Mój obiekt „objJSON” jest obiektem JSON zawierającym tablicę, liczbę całkowitą, ciąg znaków i treść HTML. Jego całkowity rozmiar to> 3500 znaków.
źródło
Wiem, że zaakceptował odpowiedź. Ale śledzenie może pomóc przyszłym czytelnikom, jeśli odpowiedź z jakiegoś powodu nie pasuje.
Angular nie robi ajax tak samo jak jQuery. Podczas gdy starałem się postępować zgodnie z instrukcjami, aby zmodyfikować kąt
$httpprovider
, napotkałem inne problemy. Np. Używam kodu, w którym$this->input->is_ajax_request()
funkcja zawsze zawodziła (która została napisana przez innego programistę i używana globalnie, więc nie mogę zmienić) mówiąc, że to nie jest prawdziwe zapytanie ajax.Aby to rozwiązać, skorzystałem z odroczonej obietnicy . Przetestowałem to w przeglądarce Firefox i ie9 i działało.
Mam następującą funkcję zdefiniowaną poza dowolnym kodem kątowym. Ta funkcja wykonuje regularne wywołanie ajax jquery i zwraca obiekt odroczony / obiecany (wciąż się uczę).
Następnie nazywam go kodem kątowym za pomocą następującego kodu. Pamiętaj, że musimy
$scope
ręcznie zaktualizować za pomocą$scope.$apply()
.To może nie być idealna odpowiedź, ale pozwoliło mi to na użycie wywołań jquery ajax z angular i pozwoliło mi zaktualizować
$scope
.źródło
Miałem ten sam problem w trybie ekspresowym .. aby rozwiązać, musisz użyć bodyparsera do parsowania obiektów json przed wysłaniem żądań HTTP ..
źródło
Mam nadzieję, że to pomoże.
źródło
Nie znalazłem pełnego fragmentu kodu dotyczącego sposobu użycia metody $ http.post do wysyłania danych do serwera i dlaczego nie działa w tym przypadku.
Objaśnienia do poniższego fragmentu kodu ...
Ustawienie Content-Type w zmiennej config, która zostanie przekazana wraz z żądaniem angularJS $ http.post, które instruuje serwer, że wysyłamy dane w formacie www post.
Zwróć uwagę na metodę $ htttp.post, w której wysyłam pierwszy parametr jako adres URL, drugi parametr jako dane (serializowane) i trzeci parametr jako config.
Pozostały kod jest zrozumiały.
Spójrz na przykładowy kod metody $ http.post tutaj .
źródło
Jeśli używasz PHP, jest to łatwy sposób na dostęp do tablicy w PHP z AngularJS POST.
źródło
Jeśli używasz Angular> = 1.4 , oto najczystsze rozwiązanie z wykorzystaniem serializatora dostarczonego przez Angular :
Następnie możesz to zrobić w dowolnym miejscu w aplikacji:
I poprawnie serializuje dane jako
param1=value1¶m2=value2
i wysyła je/requesturl
zapplication/x-www-form-urlencoded; charset=utf-8
nagłówkiem Content-Type, jak zwykle oczekuje się w przypadku żądań POST w punktach końcowych.TL; DR
Podczas moich badań odkryłem, że odpowiedź na ten problem ma wiele różnych smaków; niektóre są bardzo skomplikowane i zależą od funkcji niestandardowych, niektóre zależą od jQuery, a niektóre są niepełne w sugerowaniu, że wystarczy ustawić nagłówek.
Jeśli właśnie ustawisz
Content-Type
nagłówek, punkt końcowy zobaczy dane POST, ale nie będzie w standardowym formacie, ponieważ jeśli nie podasz ciągu jako obiektudata
lub ręcznie nie serializujesz obiektu danych, wszystko to zostanie serializowane jako JSON przez domyślna i może być niepoprawnie interpretowana w punkcie końcowym.np. jeśli w powyższym przykładzie nie ustawiono poprawnego serializatora, będzie on widoczny w punkcie końcowym jako:
A to może prowadzić do nieoczekiwanego analizowania, np. ASP.NET traktuje go jako
null
nazwę parametru o{"param1":"value1","param2":"value2"}
wartości; lub Fiddler interpretuje to w drugą stronę, z{"param1":"value1","param2":"value2"}
nazwą parametru inull
wartością.źródło
Podobnie do sugerowanego formatu roboczego OP i odpowiedzi Denisona, z wyjątkiem użycia
$http.post
zamiast tylko$http
i nadal zależy od jQuery.Zaletą korzystania z jQuery jest to, że złożone obiekty są poprawnie przekazywane; przed ręcznym przekształceniem w parametry URL, które mogą zakłócić dane.
źródło
Kiedy miałem ten problem, parametr, który publikowałem, okazał się tablicą obiektów zamiast prostego obiektu.
źródło
Właśnie zaktualizowano z kątowego 1.2 do 1.3, znaleziono problem w kodzie. Przekształcenie zasobu doprowadzi do nieskończonej pętli, ponieważ (myślę) o obietnicy $ zawierającej ponownie ten sam obiekt. Może to pomoże komuś ...
Mógłbym to naprawić przez:
źródło
Od jakiegoś czasu korzystam z przyjętego kodu odpowiedzi (kodu Felipe) i działa on świetnie (dzięki, Felipe!).
Jednak niedawno odkryłem, że ma problemy z pustymi obiektami lub tablicami. Na przykład podczas przesyłania tego obiektu:
PHP wydaje się wcale nie widzieć B i C. Otrzymuje to:
Spojrzenie na rzeczywiste żądanie w Chrome pokazuje:
Napisałem alternatywny fragment kodu. Wygląda na to, że działa dobrze z moimi przypadkami użycia, ale nie przetestowałem go dokładnie, więc używaj go ostrożnie.
Użyłem TypeScript, ponieważ lubię mocne pisanie, ale łatwo byłoby przekonwertować na czysty JS:
Jest mniej wydajny niż kod Felipe, ale nie sądzę, żeby miało to duże znaczenie, ponieważ powinno być natychmiastowe w porównaniu do ogólnego obciążenia samego żądania HTTP.
Teraz PHP pokazuje:
O ile mi wiadomo, PHP nie może rozpoznać, że Ba i C są pustymi tablicami, ale przynajmniej pojawiają się klucze, co jest ważne, gdy istnieje kod, który opiera się na pewnej strukturze, nawet jeśli jest ona zasadniczo pusta.
Zauważ też, że konwertuje niezdefiniowane si null na puste ciągi.
źródło
Po prostu umieść dane, które chcesz wysłać, jako drugi parametr:
Inną formą, która również działa, jest:
Upewnij się, że
paramName
dokładnie odpowiada nazwie parametru wywoływanej funkcji.Źródło: Metoda skrótu postowego AngularJS
źródło
Rozwiązałem to przez poniższe kody:
Po stronie klienta (Js):
zauważ, że dane są przedmiotem.
Na serwerze (ASP.NET MVC):
i „AllowCrossSiteJsonAttribute” jest wymagany w przypadku żądań między domenami:
Mam nadzieję, że to się przydało.
źródło