简体   繁体   中英

Send JSON to PHP and get a response

I'm just learning how to use jQuery and PHP together. This is my first attempt, and I feel like I'm almost getting the concept. However, there's an issue I failed to address. When I post a JSON object to PHP script and try to return one of the parameters, I get the following error : "Trying to get property of non-object in ..."

index.html:

<!DOCTYPE html>
<html>
    <head>
        <script src="http://code.jquery.com/jquery-git2.js"></script>
        <meta charset=utf-8 />
        <title>JS Bin</title>
        <style id="jsbin-css"></style>
    </head>
    <body>
        <button onClick="postData();">Submit me!</button>
        <script>
            function postData() {
                var myData = {
                    'firstName' : 'John',
                    'lastName' : 'Doe'
                };   

                $.ajax( {
                    type: "POST",
                    url: "postData.php",
                    contentType: "application/json",
                    data: myData,
                    success: function(msg){ 
                        alert(msg);
                    },
                    error: function(err) {
                         alert('error!' + err);
                    }
                });
            }
        </script>
    </body>
</html>

postData.php:

<?php
    $input = file_get_contents('php://input');
    $jsonData = json_decode($input);    
    $output = $jsonData->{'firstName'};
    echo $output;
?>

With a bit more work, you can achieve this using a REST client that will automatically handle data-type conversion and URL parsing among other things.

To name some of the advantages of using a REST architecture:

  • Simple.

  • You can easily scale your solution using caching, loading-balancing etc.

  • Allows you to logically separate your URL-endpoints.

  • It gives you the flexibility to change implementation easily without changing clients.

Try reading, A Brief Introduction to REST to get a better idea about the design pattern and it's uses. Of course you won't need to write a framework from scratch if you don't want to, since there are already several open-source PHP based implementations out there such as Recess PHP Rest Framework .

Hope this helps!

json_decode (depending on PHP version) defaults to returning an array, not an object. The proper way to access it would be:

$output = $jsonData['firstname'];

You'll also want it to return an associative array, so pass true as the second argument of json_decode.

$jsonData = json_decode($input, true);  

What could alternately be happening is that the JSON is invalid, in which case PHP returns null . You can check for that:

if ($jsonData = json_decode($input, true) === null) {
    // Do stuff!
} else {
    // Invalid JSON :(
}

I put it a little bit more simple with the function post of jquery. I hope you found it useful:

first your html and js:

<!DOCTYPE html>
      <html>
      <head>
      <script src="http://code.jquery.com/jquery-git2.js"></script>
      <meta charset=utf-8 />
      <title>JS Bin</title>
      <style id="jsbin-css">
      </style>
      </head>
      <body>
        <button onClick="postData();">Submit me!</button>
      <script>
      function postData() {
        $.post(
            "postData.php",
            {
                firstName : 'John',
                lastName : 'Doe'
            },
            function(msg)
            {
                alert(msg);
            }
        );
      }

      </script>
      </body>
      </html>

then your php:

<?php
    echo $_REQUEST['firstName']." - ".$_REQUEST['lastName'];
?>

I finally figured it out:

js:

function postData() {
var myData = {
  firstName: 'John',
  lastName: 'Doe'
};     

$.ajax({
    type: "POST",
    url: "postData.php",
    data: JSON.stringify(myData),
    success: function(msg){ 
        alert(msg);
    },
    error: function(err){
      alert('error!' + JSON.stringify(err));
    }
});
}

php:

<?php
$input = file_get_contents('php://input');
$jsonData = json_decode($input);
$output = $jsonData->{'firstName'};
echo $output;
?>

When decoding you DON'T want to put "true" as the second argument, because then, it's not JSON but an associative array (or so I've read). If I put json_decode($input, true), then it won't work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM