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
    Facebook Open Graph META Tags

    It's no secret that Facebook has become a major traffic driver for all types of websites.  Nowadays even large corporations steer consumers toward their Facebook pages instead of the corporate websites directly.  And of course there are Facebook "Like" and "Recommend" widgets on every website.  One...

  • By
    An Interview with Eric Meyer

    Your early CSS books were instrumental in pushing my love for front end technologies. What was it about CSS that you fell in love with and drove you to write about it? At first blush, it was the simplicity of it as compared to the table-and-spacer...

Incredible Demos

  • By
    CSS Scoped Styles

    There are plenty of awesome new attributes we've gotten during the HTML5 revolution:  placeholder, download, hidden, and more.  Each of these attributes provides us a different level of control over an element on the page, but there's a new element attribute that allows...

  • By
    RealTime Stock Quotes with MooTools Request.Stocks and YQL

    It goes without saying but MooTools' inheritance pattern allows for creation of small, simple classes that possess immense power.  One example of that power is a class that inherits from Request, Request.JSON, and Request.JSONP:  Request.Stocks.  Created by Enrique Erne, this great MooTools class acts as...

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!