У меня есть форма с тегом ng-submit="login()
В javascript функция получила название fine.
function LoginForm($scope, $http) { $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; $scope.email = "fsdg@sdf.com"; $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'); }); } }
Я получаю ответ 200 OK из файла PHP, однако возвращенные данные говорят о том, что email
и password
не определены. Это все php у меня есть
<?php $email = $_POST['email']; $pass = $_POST['password']; echo $email; ?>
Любая идея, почему я получаю неопределенные значения POST
?
РЕДАКТИРОВАТЬ
Я хотел бы указать, так как это, кажется, популярный вопрос (но он старый), .success
и .error
были устаревшими, и вы должны использовать. Then, как @James Gentes указал в итогах
angularjs .post()
умолчанию использует заголовок Content-type для application/json
. Вы переопределяете это, чтобы передавать данные, закодированные в форме, однако вы не изменяете значение data
для передачи соответствующей строки запроса, поэтому PHP не $_POST
как вы ожидаете.
Мое предложение состояло в том, чтобы просто использовать параметр angularjs по умолчанию для application/json
как заголовок, прочитать исходный ввод в PHP и затем десериализовать JSON.
Это можно сделать в PHP следующим образом:
$postdata = file_get_contents("php://input"); $request = json_decode($postdata); $email = $request->email; $pass = $request->password;
В качестве альтернативы, если вы в большой степени полагаетесь на функциональность $_POST
, вы можете сформировать строку запроса, например email=someemail@email.com&password=somepassword
и отправить ее как данные. Убедитесь, что эта строка запроса закодирована в URL. Если вы jQuery.serialize()
вручную (в отличие от использования чего-то вроде jQuery.serialize()
), jQuery.serialize()
encodeURIComponent()
должен сделать трюк для вас.
Я делаю это на стороне сервера, в начале моего файла init, работает как шарм, и вам не нужно ничего делать в угловом или существующем php-коде:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST)) $_POST = json_decode(file_get_contents('php://input'), true);
В API, который я разрабатываю, у меня есть базовый контроллер и внутри его метода __construct () у меня есть следующее:
if(isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], "application/json") !== false) { $_POST = array_merge($_POST, (array) json_decode(trim(file_get_contents('php://input')), true)); }
Это позволяет мне просто ссылаться на данные json как $ _POST ["var"], когда это необходимо. Прекрасно работает.
Таким образом, если аутентифицированный пользователь подключается к библиотеке, такой как jQuery, который отправляет почтовые данные по умолчанию Content-Type: application / x-www-form-urlencoded или Content-Type: application / json, API будет отвечать без ошибок и будет сделать API немного более дружественным для разработчиков.
Надеюсь это поможет.
Угловой Js Демо-код: –
angular.module('ModuleName',[]).controller('main', ['$http', function($http){ var formData = { password: 'test pwd', email : 'test email' }; var postData = 'myData='+JSON.stringify(formData); $http({ method : 'POST', url : 'resources/curl.php', data: postData, headers : {'Content-Type': 'application/x-www-form-urlencoded'} }).success(function(res){ console.log(res); }).error(function(error){ console.log(error); }); }]);
Код сервера: –
<?php // it will print whole json string, which you access after json_decocde in php $myData = json_decode($_POST['myData']); print_r($myData); ?>
Из-за углового поведения нет прямого метода для нормального поведения почты на сервере PHP, поэтому вам нужно управлять им в json-объектах.
Поскольку PHP не воспринимает JSON 'application/json'
один из них заключается в том, чтобы обновить заголовки и параметры с углового так, чтобы ваш api мог напрямую использовать данные.
Во-первых , параметризуйте свои данные:
data: $.param({ "foo": $scope.fooValue })
Затем добавьте следующее к вашему $http
headers: { 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' },
Если все ваши запросы отправляются на PHP, параметры могут быть установлены глобально в конфигурации следующим образом:
myApp.config(function($httpProvider) { $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; });
Вам необходимо десериализовать данные формы, прежде чем передавать его как второй параметр в .post (). Вы можете достичь этого, используя метод $ .param (data) jQuery. Тогда вы сможете на стороне сервера ссылаться на него как $ .POST ['email'];
Это лучшее решение (IMO), поскольку оно не требует jQuery и не декодирует JSON:
Источник: https://wordpress.stackexchange.com/a/179373 и: https://stackoverflow.com/a/1714899/196507
Резюме:
//Replacement of jQuery.param var serialize = function(obj, prefix) { var str = []; for(var p in obj) { if (obj.hasOwnProperty(p)) { var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p]; str.push(typeof v == "object" ? serialize(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v)); } } return str.join("&"); }; //Your AngularJS application: var app = angular.module('foo', []); app.config(function ($httpProvider) { // send all requests payload as query string $httpProvider.defaults.transformRequest = function(data){ if (data === undefined) { return data; } return serialize(data); }; // set all post requests content type $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; });
Пример:
... var data = { id: 'some_id', name : 'some_name' }; $http.post(my_php_url,data).success(function(data){ // It works! }).error(function() { // :( });
PHP-код:
<?php $id = $_POST["id"]; ?>
Это старый вопрос, но стоит упомянуть, что в Angular 1.4 $ httpParamSerializer добавляется и при использовании $ http.post, если мы используем $ httpParamSerializer (params) для передачи параметров, все работает как обычный почтовый запрос, и десериализация JSON не является необходимо на стороне сервера.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
Мне потребовалось много часов, чтобы понять это, работая с Angular и PHP. Почтовые данные не собирались на PHP в $ _POST
в PHP-коде выполните следующие действия. – Создать переменную $ angular_post_params. Затем выполните следующие $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
теперь вы можете получить доступ к своим параметрам, например, от $ _POST
$angular_http_params["key"]
в случае, если вы задавались вопросом о javascript … это то, что я использовал
var myApp = angular.module('appUsers', []); //var post_params = $.param({ request_type: "getListOfUsersWithRolesInfo" }); var dataObj = { task_to_perform: 'getListOfUsersWithRolesInfo' }; myApp.controller('ctrlListOfUsers', function ($scope, $http) { $http({ method: 'POST', dataType: 'json', url: ajax_processor_url, headers: { 'Content-Type': 'application/json' }, data: dataObj, //transformRequest: function(){}, timeout: 30000, cache: false }). success(function (rsp) { console.log("success"); console.log(rsp); }). error(function (rsp) { console.log("error"); }); });