检索Angularjs Http Post数据

时间:2015-03-16 16:28:52

标签: php ajax angularjs

我是angularjs的新手。我通过发送请求将用户凭据(即用户名和密码)发送到服务器(用php编写),我做了一个简单的应用来测试身份验证,但奇怪的是,从服务器我无法使用$ _POST获取数据而是我可以检索它通过$ _GET。我已经检查了其他部分,如CORS,发现没有错误。指南将不胜感激。感谢。

这是我的角度工厂方法:

app.factory("loginFact", function($http){
    this.user = {
        isAuthenticated: false,
        name: "",
        token: ""
    }


    this.makeLoginRequest = function(user,pass) {

        var req = {
            method: 'post',
            url: 'http://localhost/login/authenticate.php',
            headers: {
                'Content-Type': "multipart/form-data"
            },
            params: { username: user, password:pass }
        }


        $http( req ).success(function(data){
            console.log( "Success: " + data )
        }).error(function (data) {
            console.log( "Error: " + data )
        });
    }

    return{
        makeLoginRequest: this.makeLoginRequest
    }

});

以下是我的服务器部分:

<?php
header('Accept-Charset: utf-8');
header('Connection: keep-alive');
header('Content-Type: multipart/form-data,');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header('Access-Control-Allow-Headers: accept, content-type');
header('Access-Control-Request-Headers: X-Requested-With, accept, content-type');


try{


        if(($_POST["username"] == "test") && ($_POST["password"] == "test") ){
                echo "{\"id\": \"700\",    \"user\": {      \"uid\": \"123456\",      \"role\": \"admin\", \"name\": \"waqar\" }}";
                return;
        }else{
                echo "phase1: invalid username/password";
                return;
        }
}catch(Exception $e){
        echo $e->getMessage();
}

try{
        $request_body = file_get_contents('php://input');
        $data = json_decode($request_body);

        if($data->username == "test" && $data->password == "test"){
                echo "{\"id\": \"700\",    \"user\": {      \"uid\": \"123456\",      \"role\": \"admin\", \"name\": \"waqar\" }}";
                return;
        }
        else{
                echo "phase2: Invalid username/password";
                return;
        }
}catch(Exception $e){
        echo $e->getMessage();
        return;
}

?>

1 个答案:

答案 0 :(得分:0)

通过在params对象中发送数据,数据将作为查询参数在标题中发送(在网址 - ?key1=value1&key2=value2中)。

您必须使用data对象密钥将其发送到正文中:

var req = {
    method: 'post',
    url: 'http://localhost/login/authenticate.php',
    headers: {
        'Content-Type': "multipart/form-data"
    },
    data: { username: user, password:pass }
}

查看documentation了解详情。

如果我理解正确,请在评论中提出:为什么要将参数放入请求的正文而不是URL?

您可以在网址中发送它们,但是您会遇到一些缺点:

  • 编码在身体上比在URL中更好
  • 您可以在正文中发送更多数据,因为网址的长度通常有限(因系统而异,但大约有2000个字符)
  • 更容易欺骗网址
  • 系统通常会将URL保存在日志中,因此如果有人看到日志,您可能会暴露客户的帐户(考虑到即使您在数据库中加密/散列它们,它们也会以纯文本格式保存)< / LI>
  • 考虑到前一点,在某些国家/地区,记录敏感数据可能是违法的。