PHPを使ってPOSTメソッドでJSONを送る
(この記事は以前に http://nanatomo.com/program/792 で公開されていたものです。)
PHPで別のHTTPサーバにPOSTメソッドでデータを送信する場合、以下のようにすれば送信できます。
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $result = curl_exec($ch); curl_close($ch);
ここで $url に送信先アドレスを、$data に送信するデータを代入しておきます。
しかし問題なのは、$data にJSONにした文字列を代入する場合です。Curl側でデータの自動変換をしているらしく、配列の場合はクエリ文字列に変換し、クエリ文字列の場合はそのまま送出します。JSON文字列の場合を試しましたが、空の文字列を送出したり、一見して理解不能な文字列を送出したりしました。
解決法
参照: http://rahulmehta1.wordpress.com/2011/09/02/how-to-pass-json-with-php/
Content-Typeをオプションで指定すれば正常に送信されました。下のコードは上記のページにあるコードを若干改変したものです。
function postFromHTTP($url, $data) { $options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_AUTOREFERER => true, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_POST, true); curl_setopt_array($ch, $options); $result = curl_exec($ch); curl_close($ch); return $result; }