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
    Convert XML to JSON with JavaScript

    If you follow me on Twitter, you know that I've been working on a super top secret mobile application using Appcelerator Titanium.  The experience has been great:  using JavaScript to create easy to write, easy to test, native mobile apps has been fun.  My...

  • By
    Responsive Images: The Ultimate Guide

    Chances are that any Web designers using our Ghostlab browser testing app, which allows seamless testing across all devices simultaneously, will have worked with responsive design in some shape or form. And as today's websites and devices become ever more varied, a plethora of responsive images...

Incredible Demos

  • By
    Smooth Scrolling with MooTools Fx.SmoothScroll

    I get quite a few support requests for my previous MooTools SmoothScroll article and the issue usually boils down to the fact that SmoothScroll has become Fx.SmoothScroll. Here's a simple usage of Fx.SmoothScroll. The HTML The only HTML requirement for Fx.SmoothScroll is that all named...

  • By
    Multiple File Upload Input

    More often than not, I find myself wanting to upload more than one file at a time.  Having to use multiple "file" INPUT elements is annoying, slow, and inefficient.  And if I hate them, I can't imagine how annoyed my users would be.  Luckily Safari, Chrome...

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!