【PHP】API実行ツールを作ってみよう(その2)

#はじめに
PHPでツール作成の第四回目です。
前回のAPIツールの続きで、今回はPHPを使ってクライアント側を作成していきたいと思います。

#PHPで作成することのメリットについて
前回紹介したChrome拡張のツールを使えばサーバと通信出来るのに、
わざわざクライアントを自作する意味があるのか？と疑問に思われる方も居るかもしれないので少しメリットについて記載します。

1.APIの連続実行
PHPを使うことで、APIを連続で実行することが可能になります。
それにより例えばサーバの負荷試験(1分間に60回以上通信する等)などが容易に試験可能になります。

2.複数APIの実行
1.と似ているのですが、データ削除を行うAPI、データ作成を行うAPIがそれぞれあったとして、
一回のスクリプト実行で「データ削除→データ作成」のAPIを連続で実行すれば楽にデータ作成を行った環境が構築可能になります。

個人的には連続実行出来るのが一番のメリットではないかなと思っています。

#クライアント作成
では、クライアントを作成してみましょう。
作成場所は前回同様に「<b>c:￥xampp￥htdocs￥api</b>」フォルダになります。
「<b>api</b>」フォルダ内に「<b>client.php</b>」ファイルを作成します。
中身は下記になります。

```php:client.php
//------------------------------------------------------
// client.php   API送信クライアント
// 
// 実行コマンド
// cd C:\xampp\htdocs\api\
// php client.php テスト
//------------------------------------------------------

// 引数チェック
if( count($argv) < 2 ){
    echo "エラー:引数が足りません\n";
    echo "EX:\n";
    echo "php client.php テスト\n";
    exit;
}
$param = $argv[1];

$url = "http://localhost/api/server.php";       // 接続先URL

echo "-----[api start]-----\n";

$ret = sendApi( $url, $param );

echo "-----[api end]-----\n";

// API実行
function sendApi( $url, $param ) {

    // プロキシ情報
    $proxy_host = "proxy_ipaddress";
    $proxy_port = "port_no";
    $proxy_user = "username";
    $proxy_pass = "password";
    $proxy_auth = base64_encode("$proxy_user:$proxy_pass");

    // パラメータ設定
    $content = "name=".$param."";
    $content = mb_convert_encoding( $content, "UTF-8", "auto" );

    // ヘッダデータ作成
    $header = array(
        "Content-Type: application/x-www-form-urlencoded;",
        "Content-Length: ".strlen($content),
    //    "Proxy-Authorization: Basic ".$proxy_auth
    );

    $contextOptions = array(
        "http" => array(
            "protocol_version" => 1.1,
            "method"  => "POST",
            "header"  => implode( "\r\n", $header ),
            "ignore_errors" => true,
    //        "proxy" => "tcp://$proxy_host:$proxy_port",
            "request_fulluri" => true,
            "content" => $content
        )
    );
    $sslContext = stream_context_create( $contextOptions );
    
    // API実行
    $response = file_get_contents( $url, false, $sslContext );

    // リクエストパラメータ保存
    file_put_contents( "./request.txt", $content );  // ファイル出力
        
    // レスポンスパラメータ保存
    file_put_contents( "./response.txt", $response );  // ファイル出力

	return $response;
}
```
#コード解説
- 11～17行目・・実行時に引数が指定されているかチェックしています。
- 28行目・・API実行を行うメソッドです。
- 31～36行目・・外部接続時にプロキシ接続が必要な場合の設定です、もし必要であれば書き換えて下さい。
- 46、55行目・・上記のプロキシ接続が必要な場合に限り、コメントアウトを解除して下さい。
- 63行目・・APIを実行しています。
- 65～69行目・・送信したリクエストパラメータと受信したレスポンスを、テキストファイルに保存しています。

#クライアント動作確認
ではクライアントを実行してみましょう。
「<b>api</b>」フォルダ上で、コマンドプロンプトを起動し、以下のように入力します。
php client.php PHPクライアントから送信！
![qiita_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/344664f3-be7f-5b29-8b1b-b63ac7fc1ec1.png)

API実行に成功した場合、以下のように表示されます。
![qiita_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/732ca51d-a0ce-75ee-510b-4a8b950bb32b.png)


#サーバ動作確認
続いてサーバ側の確認を行います。
「<b>api</b>」フォルダにアクセスし、以下の3ファイルが作成されていれば成功です。
![qiita_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/68ebd596-ec15-d1f6-4cd5-0aa5832f2da6.png)

[request.txt]
![qiita_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/43fb9775-3755-540d-1e16-b2025df417b8.png)

[response.txt]
![qiita_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/5de12377-58a4-bbf7-fb47-b40c20bea7ca.png)


[サーバ側で作成された実行日付のテキストファイル]
![qiita_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/be308ce2-9dbb-7ec4-d516-308d10040ad2.png)

それぞれのファイルの中身が上記のようになっていればAPI実行が成功しています。

#最後に
今回のツールを使えば簡単にAPI送受信のテストが実行出来るかと思います。
是非活用してみて下さい。