読者です 読者をやめる 読者になる 読者になる

それマグで!

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

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

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

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変数名に縛られなくて便利ですね。

2017-03-08 追記

node の fetch や python の urllib.request みたいに、APIデバッグが面倒な子たちは、サンプルサーバーを作って、サーバー側でJSONを受け取れてるか見て上げる必要がる。

そこで次のような info_json.php を作って、正しくjson送信できてるかチェック用のリクエスト受付を作っておく


```php
$_BODY,
'error' => 'invalid json'
];
}
$_SERVER['_BODY'] = $_BODY;
}
$obj = [
'_COOKIE' => $_COOKIE,
'_SERVER' => $_SERVER,
'_GET' => $_GET,
'_POST' => $_POST,
'_BODY' => $_BODY,
];



echo json_encode( $obj );

```
こんな風にリクエストを次々ほうれば、問題が減る。。

f:id:takuya_1st:20170308020523p:plain




広告を非表示にする