@Post

@Post

@フォロワー #0

[PHP]PHPでHTTP POSTされたJSON本文を受け取る方法について @Post @JSON @php

iQi @回答 • 2015-05-28 11:59 • @フォロワー #1 • 1 回答 • 3897 Views

さらに...
0

{ 賛成 }:

JSONを本文にPOSTリクエストを投げることが増えてきた
{{{
HTTP/1.1
Content-Type:application/json ###<-- jsonになっている
}}}
で直接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);//→json object
$arr = json_decode($json_string,true);//→php array
var_dump($obj);
}}}
とすれば受け取ることができます。

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

@概要

@関連

@フォロワー #0