Eu tenho um formulário com a tag ng-submit="login()
A função é chamada bem em javascript.
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');
});
}
}
Estou recebendo uma resposta 200 OK do arquivo PHP, no entanto, os dados retornados dizem isso email
e password
são indefinidos. Este é todo o php que tenho
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Alguma ideia de por que estou recebendo POST
valores indefinidos ?
EDITAR
Eu queria apontar, já que esta parece ser uma pergunta popular (embora seja antiga), .success
e .error
foi descontinuada e você deve usar .then
como @James Gentes apontou nos comentários
php
javascript
angularjs
Ronnie
fonte
fonte
$http
?Form-Data
diz{"email":"[email protected]","password":"1234"}
print_r($_POST);
e experimentejson_decode()
o índice certoecho 'test';
funciona bem. Estou certamente apontando para o arquivo certoRespostas:
angularjs
.post()
padroniza o cabeçalho do tipo de conteúdo paraapplication/json
. Você está substituindo isso para passar dados codificados por formulário, no entanto, não está mudando seudata
valor para passar uma string de consulta apropriada, portanto, o PHP não está preenchendo$_POST
conforme o esperado.Minha sugestão seria apenas usar a configuração angularjs padrão de
application/json
como cabeçalho, ler a entrada bruta em PHP e desserializar o JSON.Isso pode ser conseguido em PHP assim:
Como alternativa, se você depende muito da
$_POST
funcionalidade, pode formar uma string de consulta como[email protected]&password=somepassword
e enviá-la como dados. Certifique-se de que esta string de consulta seja codificada por URL. Se construído manualmente (ao invés de usar algo comojQuery.serialize()
), o JavascriptencodeURIComponent()
deve fazer o truque para você.fonte
file_get_contents("php://input");
parece meio que um hack, não? Eu nunca ouvi falar disso O que precisa acontecer para que eu possa apenas fazer referência a$_POST['email'];
$_POST
não será preenchida.Eu faço isso no lado do servidor, no início do meu arquivo init, funciona perfeitamente e você não precisa fazer nada no código PHP angular ou existente:
fonte
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
acabaria obtendo um array indexado numericamente nesses casos, algo que seria um comportamento muito inesperado em outra parte do sistema que depende de um$_POST
comportamento superglobal consistente .Na API que estou desenvolvendo, tenho um controlador de base e dentro de seu método __construct () tenho o seguinte:
Isso me permite simplesmente fazer referência aos dados json como $ _POST ["var"] quando necessário. Funciona bem.
Dessa forma, se um usuário autenticado se conectar a uma biblioteca como uma jQuery que envia dados de postagem com um padrão de Content-Type: application / x-www-form-urlencoded ou Content-Type: application / json, a API responderá sem erros e tornar a API um pouco mais amigável para o desenvolvedor.
Espero que isto ajude.
fonte
Porque o PHP não aceita nativamente JSON
'application/json'
uma abordagem é atualizar seus cabeçalhos e parâmetros do angular para que sua API possa usar os dados diretamente.Primeiro , parametrize seus dados:
Em seguida , adicione o seguinte ao seu
$http
Se todas as suas solicitações forem para PHP, os parâmetros podem ser definidos globalmente na configuração da seguinte maneira:
fonte
Código de demonstração Angular Js: -
Código do lado do servidor: -
Devido ao comportamento angular, não existe um método direto para o comportamento normal de postagem no servidor PHP, então você deve gerenciá-lo em objetos json.
fonte
.success
e.error
estão obsoletos e foram removidos da estrutura AngularJS.Você precisa desserializar os dados do formulário antes de passá-los como o segundo parâmetro para .post (). Você pode conseguir isso usando o método $ .param (data) do jQuery. Então você será capaz de fazer referência no lado do servidor como $ .POST ['email'];
fonte
Esta é a melhor solução (IMO), pois não requer jQuery e nenhuma decodificação JSON:
Fonte: https://wordpress.stackexchange.com/a/179373 e: https://stackoverflow.com/a/1714899/196507
Resumo:
Exemplo:
Código PHP:
fonte
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
ou$httpParamSerializer
para conversão do lado do cliente?É uma pergunta antiga, mas vale a pena mencionar que no Angular 1.4 $ httpParamSerializer é adicionado e ao usar $ http.post, se usarmos $ httpParamSerializer (params) para passar os parâmetros, tudo funciona como uma solicitação de postagem normal e nenhuma desserialização de JSON é necessário no lado do servidor.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
fonte
Levei horas para entender isso enquanto trabalhava com Angular e PHP. Os dados da postagem não iam para o PHP em $ _POST
no código PHP, faça o seguinte. - Crie uma variável $ angular_post_params - Em seguida, faça o seguinte
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
agora você pode acessar seus parâmetros como faz em $ _POST
$angular_http_params["key"]
caso você esteja se perguntando sobre javascript .... isso é o que eu usei
fonte
.success
e.error
estão obsoletos e foram removidos da estrutura AngularJS.