Jestem nowy w AngularJS i na początek pomyślałem o opracowaniu nowej aplikacji przy użyciu tylko AngularJS.
Próbuję nawiązać połączenie AJAX po stronie serwera, używając $http
aplikacji Angular.
Aby wysłać parametry, próbowałem:
$http({
method: "post",
url: URL,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $.param({username: $scope.userName, password: $scope.password})
}).success(function(result){
console.log(result);
});
Działa, ale używa także jQuery w $.param
. Aby usunąć zależność od jQuery, próbowałem:
data: {username: $scope.userName, password: $scope.password}
ale to wydawało się zawodzić. Potem spróbowałem params
:
params: {username: $scope.userName, password: $scope.password}
ale to również wydawało się nieskuteczne. Potem spróbowałem JSON.stringify
:
data: JSON.stringify({username: $scope.userName, password: $scope.password})
Znalazłem te możliwe odpowiedzi na moje poszukiwanie, ale nie powiodło się. czy robię coś źle? Jestem pewien, że AngularJS zapewniłby tę funkcjonalność, ale jak?
javascript
jquery
angularjs
ajax
angularjs-http
Veer Shrivastav
źródło
źródło
$http({method: 'post', url: URL, data: {username: $scope.userName, password: $scope.password}});
$scope.userName
zdefiniowana? dlaczego nie spróbowaćdata: data
?Odpowiedzi:
Myślę, że musisz zrobić, to przekształcić dane z obiektu nie w ciąg JSON, ale w parametry adresu URL.
Z bloga Bena Nadela .
Przykład stąd .
AKTUALIZACJA
Aby skorzystać z nowych usług dodanych do AngularJS 1.4, patrz
źródło
angular.element
, możesz po prostureturn angular.element.param(obj);
var obj = {a: 1, b: 2}; Object.keys(obj).reduce(function(p, c) { return p.concat([encodeURIComponent(c) + "=" + encodeURIComponent(obj[c])]); }, []).join('&');
Zmienne kodujące adresy URL korzystające tylko z usług AngularJS
W AngularJS 1.4 i nowszych dwie usługi mogą obsługiwać proces kodowania danych dla żądań POST, eliminując potrzebę manipulowania danymi za
transformRequest
pomocą zewnętrznych zależności lub takich jak jQuery:$httpParamSerializerJQLike
- serializator inspirowany przez jQuery's.param()
( zalecane )$httpParamSerializer
- serializator używany przez sam Angular do żądań GETPrzykładowe użycie
Zobacz bardziej szczegółowe demo Plunkera
Jakie są
$httpParamSerializerJQLike
i$httpParamSerializer
różneOgólnie wydaje się, że
$httpParamSerializer
używa mniej „tradycyjnego” formatu kodowania adresów URL niż w$httpParamSerializerJQLike
przypadku złożonych struktur danych.Na przykład (ignorowanie procentowego kodowania nawiasów):
• Kodowanie tablicy
• Kodowanie obiektu
źródło
$http.({...
zamiast`$http.post({...
Wszystko to wygląda na przesadne (lub nie działa) ... po prostu zrób to:
źródło
Problemem jest format ciągu JSON. Możesz użyć prostego ciągu URL w danych:
źródło
encodeURIComponent($scope.userName)
aby zakodować dane w"&myCustomParam=1"
Oto, jak powinno być (i proszę, nie wprowadzaj żadnych zmian w backendach ... na pewno nie ... jeśli twój front stack nie obsługuje
application/x-www-form-urlencoded
, to wyrzuć go ... mam nadzieję, że AngularJS to robi!Działa jak urok z AngularJS 1.5
Ludzie, dajmy wam radę:
używaj obietnic w
.then(success, error)
kontaktach$http
, zapominaj.sucess
i.error
oddzwoń (ponieważ są przestarzałe)Ze strony angularjs tutaj „ Nie można już używać ciągu JSON_CALLBACK jako symbolu zastępczego do określania, gdzie powinna się znaleźć wartość parametru wywołania zwrotnego ”.
Jeśli Twój model danych jest bardziej złożony niż sama nazwa użytkownika i hasło, nadal możesz to zrobić (jak sugerowano powyżej)
Dokument do
encodeURIComponent
można znaleźć tutajźródło
Jeśli jest to formularz, spróbuj zmienić nagłówek na:
a jeśli nie jest to formularz i zwykły plik Json, wypróbuj następujący nagłówek:
źródło
$_POST
tablicę.!źródło
Z dokumentów $ http powinno to działać ..
źródło
headers
nie wpłynie na to,data
które nadal będą musiały zostać zakodowane w taki czy inny sposób.musisz wysłać zwykły obiekt javascript, nic więcej
jeśli masz php jako back-end, będziesz musiał dokonać dalszych modyfikacji .. sprawdź ten link, aby naprawić stronę serwera php
źródło
Chociaż późna odpowiedź, znalazłem kątowe UrlSearchParams działało dla mnie bardzo dobrze, zajmuje się również kodowaniem parametrów.
źródło
To zadziałało dla mnie. Używam angular dla frontonu i laravel php dla back-endu. W moim projekcie sieć kątowa wysyła dane JSON do zaplecza laravel.
To jest mój kontroler kątowy.
To jest mój kontroler laravel php.
To jest mój routing Laravela
Wynik w przeglądarce to
Istnieje chromowane rozszerzenie o nazwie listonosz. Możesz użyć do przetestowania adresu URL zaplecza, czy działa. https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en
mam nadzieję, że moja odpowiedź ci pomoże.
źródło