Question

I've got a PHP application that uses AngularJS for the client, FlightPHP for REST services, and PHP in the back end.

However, even though I'm issuing a POST with this code here:

$scope.registerUser = function() {
    $http({
        method: 'POST',
        url: '/user/register',
        data: $scope.user
    }).success(function(data) {
                if (data.result === undefined) {
                    setAjaxMessage(data, false);
                    return;
                }

                if (data.result === 0) {
                    setAjaxMessage(data.message, true);
                }
                else {
                    setAjaxMessage(data.message, false);
                }
            }).error(function(data) {
                setAjaxMessage(data, false);
            });
};

and I'm getting a successful POST message via Firefox with the Params -> Request payload tab set to this data:

{"displayname":"user1","email":"user1@gmail.com","password":"abc123"}

when I issue this server-side:

Flight::route('POST /user/register', function() {
    echo var_dump($_POST);
    return;

    // register the user
    require 'core/register.php';
});

I get this:

array (size=0)
  empty

What gives here? I've never had an issue with the $_POST data before. I have a feeling it has something to do with FlightPHP, but I can't put my finger on it. It's getting into the handler for the POST as you can see.

Was it helpful?

Solution 2

Alright, this one is a bit funky. But it is because of FlightPHP. Normally, the answer provided by Mike Brant would be 100% correct! However, FlightPHP reads that input before I can, and according to the PHP documentation it can only be read once.

So, where does FlightPHP put it? Ha, now that's an odd one. They put it in a property named body, so I had to do this to grab those JSON values:

$vars = json_decode(Flight::request()->body, true);

The Flight::request()->body returns the JSON string. But then that needs decoded and turned into an associative array, so that's why I'm passing the true as the second parameter.

OTHER TIPS

You need to get your data from PHP's raw input if you are not posting a form-encoded query string (like is the case for raw JSON). Here is how you can read your JSON data into an appropriate PHP data structure:

$post_data = json_decode(file_get_contents('php://input'));

You should also explicitly set the Content-type header as follows:

$http({
    method: 'POST',
    url: '/user/register',
    data: $scope.user,
    headers: {'Content-Type': 'application/json'}
}).success(function(data) {
  // rest of your code
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top