Mam formularz z tagiem ng-submit="login()
Funkcja jest nazywana w javascript dobrze.
function LoginForm($scope, $http)
{
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
$scope.email = "[email protected]";
$scope.password = "1234";
$scope.login = function()
{
data = {
'email' : $scope.email,
'password' : $scope.password
};
$http.post('resources/curl.php', data)
.success(function(data, status, headers, config)
{
console.log(status + ' - ' + data);
})
.error(function(data, status, headers, config)
{
console.log('error');
});
}
}
Otrzymuję odpowiedź 200 OK z powrotem z pliku PHP, jednak zwrócone dane mówią o tym email
i password
są niezdefiniowane. To wszystko, co mam php
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Masz jakiś pomysł, dlaczego otrzymuję niezdefiniowane POST
wartości?
EDYTOWAĆ
Chciałem zwrócić uwagę, ponieważ wydaje się, że jest to popularne pytanie (ale jest stare) .success
i .error
zostało wycofane i powinieneś używać, .then
jak wskazał @James Gentes w komentarzach
php
javascript
angularjs
Ronnie
źródło
źródło
$http
?Form-Data
nim jest napisane{"email":"[email protected]","password":"1234"}
print_r($_POST);
a potem spróbujjson_decode()
na prawym indeksieecho 'test';
działa w porządku. Z pewnością wskazuję na właściwy plikOdpowiedzi:
angularjs
.post()
domyślnie ustawia nagłówek Content-Type naapplication/json
. Zastępujesz to, aby przekazywać dane zakodowane w postaci, jednak nie zmieniaszdata
wartości, aby przekazać odpowiedni ciąg zapytania, więc PHP nie zapełnia się$_POST
zgodnie z oczekiwaniami.Moja sugestia byłaby taka, aby po prostu użyć domyślnego ustawienia angularjs
application/json
jako nagłówek as, przeczytać nieprzetworzone dane wejściowe w PHP, a następnie deserializować JSON.Można to osiągnąć w PHP w następujący sposób:
Alternatywnie, jeśli w dużym stopniu polegasz na
$_POST
funkcjonalności, możesz utworzyć ciąg zapytania, taki jak[email protected]&password=somepassword
i wysłać go jako dane. Upewnij się, że ten ciąg zapytania jest zakodowany w postaci adresu URL. Jeśli jest zbudowany ręcznie (w przeciwieństwie do czegoś podobnegojQuery.serialize()
), JavascriptencodeURIComponent()
powinien załatwić sprawę za Ciebie.źródło
file_get_contents("php://input");
wydaje się trochę jak hack, prawda? Nigdy o tym nie słyszałem. Co musi się wydarzyć, abym mógł się do tego odnieść w stylu$_POST['email'];
$_POST
nie zostaną wypełnione.Robię to po stronie serwera, na początku mojego pliku init, działa jak urok i nie musisz nic robić w kątowym lub istniejącym kodzie php:
źródło
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
w takich przypadkach skończyłoby się otrzymaniem tablicy indeksowanej numerycznie, co byłoby bardzo nieoczekiwanym zachowaniem w innej części systemu, która opiera się na spójnym$_POST
zachowaniu superglobalnym.W API, które tworzę, mam kontroler podstawowy, a wewnątrz jego metody __construct () mam:
To pozwala mi w razie potrzeby po prostu odwoływać się do danych json jako $ _POST ["var"]. Działa świetnie.
W ten sposób, jeśli uwierzytelniony użytkownik połączy się z biblioteką, taką jak jQuery, która wysyła dane postu z domyślnym Content-Type: application / x-www-form-urlencoded lub Content-Type: application / json, API odpowie bez błędów i uczynić API trochę bardziej przyjaznym dla programistów.
Mam nadzieję że to pomoże.
źródło
Ponieważ PHP natywnie nie akceptuje formatu JSON,
'application/json'
jednym z podejść jest aktualizacja nagłówków i parametrów z angular, aby interfejs API mógł bezpośrednio używać danych.Najpierw sparametryzuj swoje dane:
Następnie dodaj następujące elementy do swojego
$http
Jeśli wszystkie żądania idą do PHP, parametry można ustawić globalnie w konfiguracji w następujący sposób:
źródło
Kod demonstracyjny Angular Js: -
Kod po stronie serwera: -
Ze względu na zachowanie kątowe nie ma bezpośredniej metody normalnego zachowania postów na serwerze PHP, więc musisz zarządzać nimi w obiektach json.
źródło
.success
i.error
metody są wycofywane i usunięto z ramy angularjs.Musisz deserializować dane formularza przed przekazaniem ich jako drugiego parametru do .post (). Możesz to osiągnąć za pomocą metody $ .param (data) jQuery. Wtedy będziesz mógł odwoływać się do niego po stronie serwera jak $ .POST ['email'];
źródło
To najlepsze rozwiązanie (IMO), ponieważ nie wymaga jQuery ani dekodowania JSON:
Źródło: https://wordpress.stackexchange.com/a/179373 i: https://stackoverflow.com/a/1714899/196507
Podsumowanie:
Przykład:
Kod PHP:
źródło
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
czy w$httpParamSerializer
przypadku konwersji po stronie klienta?To stare pytanie, ale warto wspomnieć, że w Angular 1.4 dodano $ httpParamSerializer, a gdy używamy $ http.post, jeśli użyjemy $ httpParamSerializer (params) do przekazania parametrów, wszystko działa jak zwykłe żądanie posta i nie ma deserializacji JSON potrzebne po stronie serwera.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
źródło
Zrozumienie tego zajęło mi wiele godzin podczas pracy z Angularem i PHP. Dane postu nie trafiały do PHP w $ _POST
w kodzie PHP wykonaj następujące czynności. - Utwórz zmienną $ angular_post_params - Następnie wykonaj następujące czynności
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
teraz możesz uzyskać dostęp do swoich parametrów, tak jak robisz to z $ _POST
$angular_http_params["key"]
w przypadku, gdy zastanawiałeś się nad javascript .... to jest to, czego użyłem
źródło
.success
i.error
metody są wycofywane i usunięto z ramy angularjs.