[php] PHP에 AngularJS HTTP 게시 및 정의되지 않음
태그가있는 양식이 있습니다. ng-submit="login()
이 함수는 자바 스크립트에서 잘 호출됩니다.
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');
});
}
}
나는 PHP 파일에서 200 OK 응답 등을 얻고있다, 그러나, 반환 된 데이터는 것을 말하고 email
및 password
정의되지 않은 있습니다. 이것은 내가 가진 모든 PHP입니다
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
왜 내가 정의되지 않은 POST
값을 얻는 지 아십니까?
편집하다
나는이 (아직 나이입니다) 인기 질문 것으로 보인다 이후 지적하고 싶었, .success
그리고 .error
사용되지 않으며 당신은 사용해야 .then
@ 제임스 씨족이 commments에서 지적
답변
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()
) Javascript가 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”]로 간단히 참조 할 수 있습니다. 잘 작동합니다.
이렇게하면 인증 된 사용자가 기본 Content-Type : application / x-www-form-urlencoded 또는 Content-Type : application / json을 사용하여 게시 데이터를 보내는 jQuery와 같은 라이브러리에 연결하면 API가 오류없이 응답하고 API를 좀 더 개발자 친화적으로 만듭니다.
도움이 되었기를 바랍니다.
답변
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';
});
답변
Angular 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 객체에서 관리해야합니다.
답변
.post ()에 두 번째 매개 변수로 전달하기 전에 양식 데이터를 역 직렬화해야합니다. jQuery의 $ .param (데이터) 메서드를 사용하여이를 수행 할 수 있습니다. 그러면 서버 측에서 $ .POST [ ’email’]과 같이 참조 할 수 있습니다.
답변
이것은 jQuery와 JSON 디코딩이 필요하지 않기 때문에 최상의 솔루션 (IMO)입니다.
출처 :
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"];
?>