Een selectie van opdrachtgevers

JSON $_POST ontvangen

Ook al heb je al 10 jaar ervaring op het gebied van PHP en denk je van alle fratsen op de hoogte te zijn, toch kan de taal je nog verrassen. Zo ook met dit.

Voor een project heb ik een tweetal modules ontwikkeld die er voor zorgen dat inhoud van domein A (Drupal 7) naar domein B (Drupal 6) kan worden verzonden. Er waren wat haken en ogen aan de functionaliteit, zoals het feit dat de informatie HTML bevat en dat er toch wel een bepaalde beveiliging in moest zitten. Voor dat laatste heb ik een methode gebruikt die ook veel bij betalingskoppelingen wordt gebruik, nl. het aaneenrijgen van key-value paren met een handtekening op basis van een secret-key. Maar door de HTML bleek het niet mogelijk om de informatie te verzenden via drupal_http_request als application/x-www-form-urlencoded. 

 

De oplossing is het posten van de informatie middels cURL naar de remote server, wat gaat als volgt:

$data_string = json_encode($a_fields);
$ch = curl_init(REQUEST_URL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, REQUEST_METHOD);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);

 

Tot zover niets aan de hand. Maar het opvangen van die data blijkt andere koek. Waar je zou verwachten dat de geposte data in $_POST terecht komt, was dat hier dus niet het geval. 

Maar met wat Googlen op StackOverflow (welke ontwikkelaar is daar niet groot mee geworden) het antwoord gevonden.

 

Om de JSON data uit te lezen, moet dat als volgt:

$json = file_get_contents("php://input");
$obj = json_decode($json);

 

Op die wijze krijg je de JSON data netjes binnen. 

 

Op PHP.net de verklaring:

php://input is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to usephp://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where$HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data.php://input is not available with enctype="multipart/form-data".http://www.php.net/manual/en/wrappers.php.php

 

Weer wat geleerd :)

Tags

PHP
JSON