json データを PHP で ( 経由で) 直接処理する正しい方法file_get_contents('php://input')
は、リクエストが適切なコンテンツ タイプContent-type: application/json
、つまり HTTP リクエスト ヘッダーに設定されていることを確認することであることがわかりました。
私の場合、このコードでcurlを使用してphpからページをリクエストしています:
function curl_post($url, array $post = NULL, array $options = array()) {
$defaults = array(
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_URL => $url,
CURLOPT_FRESH_CONNECT => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FORBID_REUSE => 1,
CURLOPT_TIMEOUT => 600
);
if(!is_null($post))
$defaults['CURLOPT_POSTFIELDS'] = http_build_query($post);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if(($result = curl_exec($ch)) === false) {
throw new Exception(curl_error($ch) . "\n $url");
}
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
throw new Exception("Curl error: ".
curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n");
}
curl_close($ch);
return $result;
}
$curl_result = curl_post(URL, NULL,
array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
CURLOPT_POSTFIELDS => json_encode($out))
);
部分に注意してくださいCURLOPT_HTTPHEADER => array('Content-Type: application/json')
。
受信側では、次のコードを使用しています。
$rawData = file_get_contents('php://input');
$postedJson = json_decode($rawData,true);
if(json_last_error() != JSON_ERROR_NONE) {
error_log('Last JSON error: '. json_last_error().
json_last_error_msg() . PHP_EOL. PHP_EOL,0);
}
max_input_vars
変数を変更しないでください。正しいヘッダーを設定するようにリクエストを変更して以来、私の問題はmax_input_vars
なくなりました。どうやら PHP は、特定が設定されている投稿変数を評価しませんContent-type
。