Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

SuperAgentからpostするときの注意

$_POSTで受け取れなくて困ったのでメモ。

結論

結論から言うと

request.post(url).type('form').send(option).end(cb);

のように.type('form')使いましょう。

(cbはコールバック関数です)

解説

Content-Typeと送信する値について

まずPOST通信するときに送る値の話をします。実は送る値はapplication/json形式、application/x-www-form-urlencoded形式、multipart/form-dataなど様々あります。そしてそれぞれデータのフォーマットが異なります。

PHPは受け取ったデータをapplication/x-www-form-urlencodedで解釈し、パース後$POSTに入れます。そのため、application/jsonて送信するとフォーマットが異なるため$POSTが空となります。

SuperAgentが送信するContent-Type

SuperAgentは実はsendに渡したデータによってデフォルトのContent-typeを決定しています。

request.post(url).send({data: data}).end(cb); // json
request.post(url).send('{"data":"' + data + '"}').end(cb); // json
request.post(url).send('data=' + data); //form

つまり、sendに 'data=data' という形式で渡さないと$_POSTで受け取れません。でも、オブジェクトをそのまま渡したいですよね。

そこで、自動ではなく手動でContent-Typeを宣言します。

request.post(url).type('form').send({data: data}).end(cb);

typeメソッドに引数として 'form' 、 'form-data' 、 'urlencoded' のいずれかを渡すとContent-Typeがapplication/x-www-form-urlencodedとなります。

終わりに

地味に悩みましたよ…おかげでいろいろ学べたのでいいですが。