2021/12/19
WebAPIを作成するときによく利用されるのが
- file_get_contetns関数
- curl関数
この二つの関数です。
今回はそのうち file_get_contetns関数 のほうを使ってPHPでPOST送信処理のコードをエントリーします。
file_get_contents は、php-curl がインストールされていない環境でも動作します。
環境などの制約がある場合はcurlライブラリの代替処理として使えます。
(※使い勝手からいうと高機能な curl のほうに軍配が上がります。)
演習
データを送信する側(send.php)
<?php
// 送信データ
$data = array(
"key1" => "value1",
"key2" => "value2"
);
// URLエンコードされたクエリ文字列を生成
$data = http_build_query($data, "", "&");
// ストリームコンテキストのオプションを作成
$options = array(
// HTTPコンテキストオプションをセット
'http' => array(
'method'=> 'POST',
'header'=> 'Content-Type: application/x-www-form-urlencoded',
'content' => $data
)
);
// ストリームコンテキストの作成
$context = stream_context_create($options);
// POST送信
$contents = file_get_contents('http://localhost/api/reception.php', false, $context);
// reception.php のレスポンスを表示
echo $contents;
データを受け取る側(reception.php)
<?php
print_r($_POST);
実行結果
解説
file_get_contents はファイルオープンの処理が簡潔に書ける PHP の関数です。
この関数にストリームコンテキストを指定するとPOST送信することができます。
PHP で API を叩く場合によく使われる関数でもあります。
HTTPプロトコルのデータ(POSTデータ)をセット
フォームでいうとname属性(param1)とvalue属性(data1)の関係になります。
$data = array(
"key1" => "value1",
"key2" => "value2"
);
設定したデータ(連想配列)をエンコードしたクエリに変換
データを送信するならURLエンコードしたクエリに変換する必要があります。
上記の配列データからクエリ文字列を生成するには、http_build_query() を使用します。
$data = http_build_query($data, "", "&");
http_build_query()関数について
<?php
# クエリを生成
$array = array( 'param1'=>'data1', 'param2'=>'data2', 'param3'=>'data3');
echo http_build_query( $array );
# 実行結果
param1=data1¶m2=data2¶m3=data3
ストリームコンテキストのオプションを作成
file_get_contents関数でPOST送信するにはストリームコンテキストを作成します。
ストリームコンテキストというのは簡単に言ってしまえばデータのやり取りを円滑にするためのものです。
ストリームコンテキストのオプションでHTTPコンテキストのデータを連想配列でセットします。
$options = array(
// HTTPコンテキストオプションをセット
'http' => array(
'method'=> 'POST',
'header'=> 'Content-Type: application/x-www-form-urlencoded',
'content' => $data
)
);
HTTPコンテキストオプションの設定項目
オプション | 説明 | デフォルト |
---|---|---|
method | GET 、 POST などのリクエストメソッド名 | GET |
header | リクエストに付加されるヘッダ | |
user_agent | User-Agent: ヘッダとして送信する値。 header オプションで user-agent が 定義されていない 場合のみ使用されます。 | php.ini での user_agent の設定 |
content | ヘッダの後に送信する追加データ。通常、POST または PUT リクエストの際に使用されます。 |
ストリームコンテキストの生成
ストリームコンテキストを生成するには、stream_context_create関数を使用します。
引数にはオプションを入れます。指定するオプションは配列になります。
$context = stream_context_create($options);
file_get_contentsでPOST送信
# 書式
file_get_contents($filename, $use_include_path, $context, $offset, $maxlen);
- $filename
- 内容を読み込むファイルやURLを指定します。
- $use_include_path
- 指定するとinclude_pathからファイルを検索できます。指定しない場合は、falseです。
- $context
- 独自のコンテキストを使う場合に指定します。使わない場合は、NULLを指定します。
- $offset
- 読み込みを開始する位置を指定します。
- $maxlen
- 読み込むデータの最大バイト数を指定します。
演習では「読み込みを開始する位置」「読み込むデータの最大バイト数」は必要ありません。よって第三引数までしか指定してません。
送信データを表示
受け取り側のプログラム(WEB API)で print_r($_POST); にして、送信データを表示させます。
file_get_contents関数で送信して取得したデータを $contents に代入。
それをエコーで表示させると、POST送信データを表示することができます。
なお、アクセスするページは send.php になります。reception.php に直接アクセスしてもPOST送信されないので何も表示されません。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。