PHP: Get POST JSON

By  on  

My recent work at Mozilla has me creating an OAuth-like authentication transaction between Bugzilla and Phabricator.  This task has thrust me back into the world of PHP, a language I haven't touched much (since version ~5.2) outside of creating WordPress themes and plugins for this blog.  Coming back to a language you haven't touched in years feels like a completely new experience; you notice patterns and methods that you wouldn't have guessed of in years past.

Part of the authentication transaction requires Phabricator to receive a POST request that contains JSON data.  I had expected the data to land in $_POST but the variable was empty; how the hell do I get the POST data?  To get POST JSON with PHP, you use the following:

# Get JSON as a string
$json_str = file_get_contents('php://input');

# Get as an object
$json_obj = json_decode($json_str);

file_get_contents, which I though was only used to retrieve content from local files or traditional URLs, allows you to use the special php://input address to retrieve JSON data as a string.  From there you use json_decode to turn the JSON string into a workable object/array.

It makes sense that the JSON isn't handled via normal $_POST since there's really no key, per se; essentially you just need the "blob" of data as a whole, which is provided by php://input.  You can test the JSON+POST handling with cURL.

Recent Features

  • By
    From Webcam to Animated GIF: the Secret Behind chat.meatspac.es!

    My team mate Edna Piranha is not only an awesome hacker; she's also a fantastic philosopher! Communication and online interactions is a subject that has kept her mind busy for a long time, and it has also resulted in a bunch of interesting experimental projects...

  • By
    I’m an Impostor

    This is the hardest thing I've ever had to write, much less admit to myself.  I've written resignation letters from jobs I've loved, I've ended relationships, I've failed at a host of tasks, and let myself down in my life.  All of those feelings were very...

Incredible Demos

  • By
    Create Digg URLs Using PHP

    Digg recently came out with a sweet new feature that allows users to create Tiny Digg URLs which show a Digg banner at the top allowing easy access to vote for the article from the page. While I love visiting Digg every once in a...

  • By
    Create a Twitter AJAX Button with MooTools, jQuery, or Dojo

    There's nothing like a subtle, slick website widget that effectively uses CSS and JavaScript to enhance the user experience.  Of course widgets like that take many hours to perfect, but it doesn't take long for that effort to be rewarded with above-average user retention and...

Discussion

  1. Lorenzo

    I always use this line of code:

    @json_decode(($stream = fopen('php://input', 'r')) !== false ? stream_get_contents($stream) : "{}");

    It does not throw a warning in case there’s no request body, and simply fallback to an empty object instead of null.

  2. @David, you might want to merge $_POST and 'php://input'

    $_POST = array_merge($_POST, (array) json_decode(file_get_contents('php://input')));
  3. Jose Maria Ferri Azorin

    You say “It makes sense that the JSON isn’t handled via normal $_POST…” but I can’t find any sense since I’m using jQuery AJAX or XMLHttpResponse calls (POST) from many years ago, parsing parameters as json or plain text and parameters, in server, are where I expect they are: $_POST array… for me, using file_get_contents('php://input') is a non-logic behaviour

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!