それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

更新が遅いのはXiの速度制限のせいだと思います。

PHPでHTTP POSTされたJSON本文を受け取る方法

JSONを本文にPOSTリクエストを投げることが増えてきた

HTTP/1.1
Content-Type:application/json   ###<-- jsonになっている

で直接JSONを本文に投げてくるクライアントが増えてきていることを知りましました。

HTTPのPOSTと言えば、form urlencodedですが、JSONを本文に入れることがあります。

HTTPヘッダサンプル(JSON版)

HTTP/1.1
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.8.4) Presto
Host: example.com
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Connection: Keep-Alive
Content-Type:application/json   ###<-- jsonになっている

{a=1,b=2}

通例であれば、application/x-www-form-urlencodedです

通常であれば、以下のように、key=value&key2=valueです。

HTTP/1.1
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.8.4) Presto
Host: example.com
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Connection: Keep-Alive
Content-Type:application/x-www-form-urlencoded

name=a%3D1  ### => {a=1,b=2}をURLエンコードしたもの

jsonを本文に入れる

通常のようにURLエンコードせずに、直接JSON文字列をサーバーに送ります。

Content-Type:application/json   ###<-- jsonになっている

{a=1,b=2}

form urlencodedではなく、JSONを本文に入れて送るのでした。

phpだと$_POST変数が空っぽ

Content-Type:application/json で送信されると、key=valueが無いので当然ながら、$_POST変数が空っぽになります。

送られたJSON本文の受け取り方

そこで、HTTPリクエスト本文にphp://input の fopen wrapperを使って直接ストリームにアクセスを試みます

<?php

$json_string = file_get_contents('php://input'); ##今回のキモ

echo $json_string;
$obj = json_decode($json_string);
var_dump($obj);

とすれば受け取ることができます。


簡単ですね。こうすれば、POST変数名に縛られなくて便利ですね。