公開日:2015/08/10
PHPでGET/POSTしたい場合、いくつかの手段がある。
標準のfile_get_contents()を使う方法、PEARを使う方法、cURLを使う方法。他にもfsockopen()とかあるらしい。
一番手軽なのはfile_get_contents()ぽいけどパフォーマンスが悪いらしい&multipart/form-dataで送信したい時は自力で組むしかなさそう。
cURLを使ってGET/POST送信する方法をメモする。
GET送信する方法
GET送信は超シンプル。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://posttestserver.com/post.php');
curl_exec($ch);
curl_close($ch);
curl_init()でcURLリソースを作成。
curl_setopt()でcURLリソースにオプションを追加していく。GETの場合はURLだけでOK。
curl_exec()で送信。
curl_close()でcURLリソースを閉じる。
これだけでechoしなくても結果が出力される。
curl_exec()の結果を直接出力したくない場合。
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'https://posttestserver.com/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
curl_setopt()でCURLOPT_RETURNTRANSFERにtrueを設定してやると出力せずに文字列を返すようになる。
これを変数で受け取って編集してechoで出力してやればOK。
POST送信する方法
application/x-www-form-urlencodedで送信する場合。
$data = 'test1=aaa&test2=bbb';
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://posttestserver.com/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
CURLOPT_POSTFIELDSにパラメータを設定するとPOST送信になる。
application/x-www-form-urlencodedで送信する場合はURLエンコードされた文字列を設定する。
連想配列をhttp_build_query()でURLエンコードして設定してもOK。
multipart/form-dataで送信する場合。
$data = array(
'test1' => 'aaa',
'test2' => 'bbb'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://posttestserver.com/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
multipart/form-dataで送信する場合はCURLOPT_POSTFIELDSのパラメータを連想配列にするだけ。
CURLOPT_POSTFIELDSのパラメータが文字列ならapplication/x-www-form-urlencoded、配列ならmultipart/form-dataになる。
ファイルを送信する場合。
$data = array(
'file'=>'@./test.jpg;filename=upload.jpg;type=image/jpeg'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://posttestserver.com/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
ファイル名は@をつけて指定する。
ファイル名を指定したい場合はfilenameも指定する。
ファイルタイプを指定したい場合はtypeも指定する。
ちなみに5.5.0以降ではCURLFileクラスなるものが登場して@は非推奨らしい。
5.5.0以降で開発する時がきたらまた調べる。
応用編。クライアントから受信したファイルを転送する場合。
$data = array(
'file'=>'@'.$_FILES['File']['tmp_name'].';filename='.$_FILES['File']['name'].';type=image/jpeg'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://posttestserver.com/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
アップロードされたファイルを取得する方法(PHP)と組み合わせればOK。
メソッドを明示的に指定する場合
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
GET/POSTの場合は上記ルールで勝手に設定されるからなくても動くけどあったほうがわかりやすい。
GET/POST以外のメソッド(PUTとかDELETEとか)を指定する場合はきっと必須。
POSTを明示的に指定する場合。
curl_setopt($ch, CURLOPT_POST, true);
POSTの場合に限ってはこっちでもいいかも。
Content-Typeを明示的に指定する場合。
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
これもapplication/x-www-form-urlencodedかmultipart/form-dataの場合は上記ルールで勝手に設定されるからなくても動くけどあったほうがわかりやすい。
これ以外のContent-Type(application/jsonとか)の場合はきっと必須。