頼りないニモニック

はっきりいって個人の日記レベル

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;
}