axiosでPOSTしたデータがサーバのPHPの$_POSTで取得できない

axiosでpostしたオブジェクトはjson形式でサーバに送られる。content-typeはapplication/jsonで送られる。PHPはこれを$_POSTに入れない。通常のhtmlのformで送られるデータとはcontent-typeも中身も違う。このjsonで送られたデータをどうやってPHPで取得すればいいか。

axiosでformDataを送る

1つの解決法はaxiosでPOSTするときにフォーム形式で送る方法。これはオブジェクトの代わりにformDataを設定する方法とcontent-typeを設定する方法があるようだがここでは考えずサーバで対応する方法を考える。

PHPでjsonを受け取る

ここではapache2+PHPのサーバを考える。その前にクライアントからポストしたデータ(HTTPのボディ)はどのように扱われるのだろうかをはっきりさせたい。

PHPのマニュアルによるとcontent-typeがapplication/x-www-form-urlencodedmultipart/form-dataの場合は$_POSTにデータが入るらしい。マルチパートというのはもともとは1つのファイルに複数のファイルを埋め込む方式でメールなどで添付ファイルを送るときに使われたものだと思う。境界となる長い文字列を設定し、それでファイルを分割する。大きいファイルを送るとき、あるいは単にファイルをおくるときはブラウザはこの形式を使うのかもしれない。あるいはバイナリを送りたいときエンコードを指定して送るから必要になるのかもしれない。

いずれにしろ$_POSTにデータが入るのはこの2つの場合だけなのでapplication/jsonの場合は$_POSTには入らない。ではどこへ行くのか?あるいは単に捨てられてしまうのだろうか。

php://input

結論を言うとここにあるように、php://inputに行くらしい。これはPHPにおいて標準入力を表すときにphp://stdinなどと書くが、php://inputはPHPによってHTTPボディからの入力にリダイレクトされていてPHPスクリプトからはここから読み込めばHTTPボディが取得できることになる。

jsonの取得

今回のデータはjson形式なのであとはこれを$_POSTに変換してあげればその他のコードは変更せずに動くはず。

元のサイトのコードが少しおかしかったので修正した。

以下のようにpostmanで送るとPHPで取得できた。

phpのcomposer覚書

nodeのnpmに近いphpのパッケージと依存マネージャ。

composerはパッケージマネージャではなく依存マネージャ。パッケージやライブラリの管理は行うがあくまでプロジェクト単位で行う。パッケージやライブラリはvendorディレクトリ配下にインストールされ、デフォルトではグローバルにインストールされない。npmやbundlerに近い。

プロジェクトが多数のライブラリに依存し、そのライブラリも他のライブラリに依存している場合に依存関係を解決してインストールしてくれる。

動作にはPHP5.3.2以上が必要。いくつかのphpフラグやコンパイルフラグも必要。インストーラを使えば警告で知らせてくれる。

compser自体のインストール

詳しくは省略。
https://getcomposer.org/installerをダウンロードしてphpで実行するか(Windows以外)。https://getcomposer.org/Composer-Setup.exeを実行してインストール。

composerはcomposer.pharという1つのファイルになっているので、これをプロジェクトに含めてもいいかもしれない。

Windowsでのバッチファイル

以下のバッチファイルをつくって、プロジェクトのルートに置くと便利。

composerの設定はcomposer.jsonに記述する。プロジェクトの依存関係が記述される。プロジェクトのルートディレクトリに置く。

デフォルトではPackagistというレポジトリからrequireで記述されたパッケージをインストールする(installコマンド)。パッケージ名はベンダー名/プロジェクト名になる。上記のバージョン指定は、1.0以上で1.1以下のパッケージを指定している。

パッケージのインストール

php composer.phar install

このコマンドを最初に実行したとき(まだcomposer.lockがない)は、必要なすべてのパッケージをvendor配下にインストールしてcomposer.lockにインストールしたバージョンを記述する。インストール時にcomposer.lockがあればこのファイルに記載されたバージョンをインストールする。このファイルを共有しておけば、開発者間でパッケージのバージョンを一致させられる。

アップデート

php composer.phar update

プラットフォームパッケージ

PHPそのものはcomposerでインストールするものではないが、依存関係は記述したい場合PHPをプラットフォームパッケージまたは仮想パッケージと呼ぶ。show –platformコマンドで一覧を表示できる。

オートロード

ライブラリがautoloadの指定を行っていれば、composerはvendor/autoload.phpを作成する。ユーザはこのファイルをインクルードしてライブラリを使うことができる。

自分自身のコードをautoloadに指定することもできる。

ここではネームスペースとディレクトリのマップをしている。srcディレクトリはプロジェクトのルートでvendorと同じ階層。これでたとえばsrc/Foo.phpはAcme\Fooクラスを含んでいることになる。

autoloadフィールドを追加した場合はvendor/autoload.phpを再構築するためにdump-autoloadコマンドを実行する必要がある。

ライブラリ

上記のautoloadの設定を行うとプロジェクトはほぼパッケージになる。違いは名前があるかどうかでこれはcomposer.jsonのnameプロパティを設定すればいい。

バージョンはVCSから推論するのでcomposer.jsonには記述しない。がVCSを使っていない場合はcomposer.jsonに記述できる。

コマンド

help

ヘルプ。引数にサブコマンドを指定すると、そのコマンドのヘルプ。

init

php composer init

composer.jsonを作成

引数なしまたはlist

ヘルプを表示

install または i

パッケージをインストール

update または u

パッケージをアップデート

search

レポジトリからパッケージを探す。composer.jsonでリポジトリを指定していない限りpackagist(デフォルトのレポジトリ)から探す。

php composer.phar search monolog

show

インストールされているパッケージを表示。*を指定してフィルタできる。パッケージを指定すると詳細を表示。

browse または home

パッケージのウェブサイトをブラウザで表示

php composer.phar browse p3k/picofeed

depends

指定されたパッケージに依存しているパッケージを表示

config

composerの設定情報の設定と表示。設定にはグローバルとローカルがある。ローカルはcomposer.jsonに保存される。レポジトリの設定などがある。

php composer.phar config –list

diagnose

エラー診断。エラーが出たときやってみるといい。