前回の記事に引き続きですが、APIを叩く側はformでデータを送るのではなく、コードの中にPOSTする処理を書きます。
選択肢としては
- curlコマンドを使う
- file_get_contentsを使う
- Guzzleなどのライブラリを使う
などの選択肢があります。file_get_contentsの方がお手軽・・ですが、HTTPリクエストを正確に行う場合はcurlの方が正しいようです。
curlコマンドの活用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
define('POST_URL', 'http://example.com'); $post_data = [ 'name' => 'hogehoge' ]; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => POST_URL, CURLOPT_RETURNTRANSFER => true, //POSTの場合は、true CURLOPT_POST => true, //HTTPレスポンスヘッダーが必要な場合はこれ CURLOPT_HEADER => true, //エンコーディングを行う場合はhttp_build_queryを挟む CURLOPT_POSTFIELDS => http_build_query($post_data), ]); $response = curl_exec($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($response, 0, $header_size); //HTTPヘッダー出力 var_dump($header); //responseの形を出力 var_dump($response); curl_close($ch); |
実際はほとんどオプションの設定になるので、細かいオプションに関しては下記のリンクで説明されています。
http://php.net/manual/ja/function.curl-setopt.php
file_get_contentsを使ったPOST送信
元々POSTを送る昨日はないですが、stream_context_create
と組み合わせることで、POSTを送ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$postdata = http_build_query($_POST, "", "&"); //header $header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: ".strlen($postdata) ); $context = array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => $postdata ) ); $url="postしたいurl"; //第二引数はinclude_pathを使用したい場合に使うようです。 file_get_contents($url, false, stream_context_create($context)); |
GuzzleなどのHTTPクライアント
こちらの方がオプションなどがしっかりと整っており、エラーハンドリングなどもできるので有効かと思います。
http://docs.guzzlephp.org/en/stable/
ストリームについて・・
stream_content_createで「ストリーム」を作っています。ファイルの入出力関連でよく聞きますが、あまり理解していないのでメモ。
もちろんPHP独自の概念ではなく、プログラミング全般に通づる考え方のようで検索するとJavaのものが多いですね。
色々調べましたが、抽象的な説明が多く、はっきりとは理解できませんでした。
あらゆる形式の入出力に対応したデータをバイト単位で読み書きする「仕組み」
みたいなもんでしょうか。
ファイルなんかの読み込みに関してはデータサイズが大きいため、中間のストリームを用意してここを媒介にしてファイル読み込みを行います。
ファイルを読み込む、ファイルポインタというのはこのストリーム上のメモリの位置を示したものという理解をしています。
入出力はファイルが多いですが、それ以外にもキーボードからの入力みたいなそういったものも入ってきます。
参考リンク
curl
file_get_contents