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

0

iQi - 面白いアプリを開発中

{ 賛成 }:

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変数名に縛られなくて便利ですね。
2015-05-26 11:10 コメント

ログインまたは登録してから回答してください

Lubo
Lubo

PHP言語が得意です

@ステータス

  • 更新: 2015-05-28 11:59
  • 閲覧: 4148
  • フォロー: 1
EXIT フルスクリーンモード 回答
  • タイトル / Bold / Italics
  • CODE
  • リンク / 画像 / 動画
  • リスト / クォート(引用)

内容が多い場合、タイトル :

## 大タイトル 
### 小さいタイトル

Italics / Bold :

**Bold** 
*Italics*
***Italics And Bold***

Code :

{{{
this is a php code.
}}}

リンク :

[リンク文字](Link) 例: [Google](http://www.google.co.jp)

画像 :

![画像備考](画像Link) 例: ![Yahoologo](http://k.yimg.jp/images/mht/2014/0206_sochi_cur.png)

動画 :

!![動画備考](動画Link) 例: !![Youtube動画](http://youtube.jp)

リスト(Sort) :

1. 123
2. 123
3. 123

リスト :

- 123
- 123
- 123

クォート(引用) : ( Returnを二回押すと、クォート(引用)を終了する )

> クォート
クォート
クォート