PHP: Get POST JSON
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.
I always use this line of code:
It does not throw a warning in case there’s no request body, and simply fallback to an empty object instead of null.
@David, you might want to merge
$_POST
and'php://input'
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 orXMLHttpResponse
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, usingfile_get_contents('php://input')
is a non-logic behaviour