file_get_contents を使ってPOST送信

2019/07/09

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エンコードしたクエリに変換する必要があります。

例)hoge=aaa&foo=bbb

上記の配列データからクエリ文字列を生成するには、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&param2=data2&param3=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送信されないので何も表示されません。

以上です。

 

独習PHP 第3版

作者の山田 祥寛さんはJavaやJavaScriptなどの本も出されている方です。どの本も説明が丁寧でとても分かりやすいと定評があります。独習シリーズはいろいろな言語で出版されており、何かしら読んだことがある人も多いと思います。PHP をきちんと理解していないと Laravel は理解できません。これから Laravel で開発をしていく人は、もしもの(行き詰った) 時のために一冊購入してみてはいかがでしょうか?

Amazonで詳細を見る

オススメ

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識