小ネタ:PHPでWebAPIを呼び出すメモ

PHPを使ってWebAPIの呼び出しを行うという仕事を受注しました。契約の関係上ソースをそのまま掲載することはできませんが、参考になるコードをいくつか書いていますので参考になれば幸いです。

また、WebAPIの呼び出しをする時に注意することについても少し触れたいと思っています。どっちかと言うと注意点のほうがメインコンテンツになるのかも...。*1

事前に知っていてほしいこと

  • PHP言語の理解は初心者レベルでいいですが知っていてほしいです。
  • APIとはなにか」についても概要の理解ができていてほしいです。

PHPでWebAPIを呼び出す基本

PHPにはcURL関数が実装されているので、そのままこの関数を使えばよいです。 https://www.php.net/manual/ja/ref.curl.php

実はこれだけの説明で終わってしまうのですが、サンプルをもとに少し説明をして文字数を稼ぎます(笑)。

cURL関数利用時の「お約束」

cURL関数を使う場合、「セッション」をオープンし、コマンド実行して、完了したらセッションをクローズする、という一連の流れを記述する必要があります。

<?php
// 1. curlセッションを初期化する
$ch = curl_init();
// 2. curlオプションを設定する
/**
ここで実行するための準備をする
例:
curl_setopt($ch, [OPTION], [Argument]);
*/
// 3. curlを実行する
curl_exec($ch);
// 4. curlセッションを終了する
curl_close($ch);
// 戻り値があればこのタイミングで(close後に)出力する

1、3、4がお約束です。DBのアクセスみたいな感じですよね。セッション開いて引数をセットして実行→閉じる、という流れ。今回フレームワークを使う予定がなかったのですが、フレームワークAPI呼び出しとかできないんですかね*2

データの取得(GETメソッド)

GETに限らないのですが、基本「curlオプションの設定」はcurl_setopt()でセットしていくイメージでよいと考えています。

curl_setopt ( resource $ch , int $option , mixed $value ) : bool

オプションの数がハンパなく多いですが、(GETメソッドに)必要そうなオプションを列記してみます。

  • $valueにbool値を設定するオプション
    • CURLOPT_HTTPGET:Trueに設定するとGETメソッドを実行する
    • CURLOPT_RETURNTRANSFER:Trueの場合はcurl_exec()の戻り値を文字列で返す。Falseの場合はデータを直接返す。※
  • $valueに数値を設定するオプション
  • $valueに文字列を設定するオプション
    • CURLOPT_URL:取得するURL。同内容をcurl_initの引数として設定可能。
    • CURLOPT_USERNAME:認証に使うユーザ名
    • CURLOPT_PASSWORD:認証に使うパスワード
    • CURLOPT_USERAGENT:HTTP リクエストで使用される "User-Agent: " ヘッダの内容。
  • $valueに配列を設定するオプション
    • CURLOPT_HTTPHEADER:HTTPヘッダ。array('Content-type: text/plain', 'Content-length: 100')といった感じ。

データの送信(POSTメソッド)

POSTの場合はそれほど多くない、というよりは、POSTメソッドで送信するデータの指定を文字列として指定して「POST」すればいい、という認識でいたりします。 * $valueにbool値を設定するオプション * CURLOPT_POST:Trueに設定するとPOSTメソッドを実行する。 * $valueに文字列を設定するオプション * CURLOPT_POSTFIELDS:送信するデータの実態。

データ取得/送信サンプル

developer.hatena.ne.jp

せっかくなんで*3はてなとか使ってみましょうか。特定の投稿を取得するとかいう時に使うわけですよ。で、GET/POSTのサンプルとして使えそうなのが、ここ。

developer.hatena.ne.jp

<?php
// GETのサンプル
// 1. curlセッションを初期化する
$ch = curl_init();
// 2. curlオプションを設定する
curl_setopt($ch, CURLOPT_HTTPGET,True);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,True);
curl_setopt($ch, CURLOPT_URL, "http://n.hatena.com/applications/my.json");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: n.hatena.com", "Authorization: OAuth ...(略)");
curl_setopt($ch, CURLOPT_USERAGENT, "ExampleUserAgent/1.0");
// 3. curlを実行する
curl_exec($ch);
// 4. curlセッションを終了する
curl_close($ch);
// 戻り値があればこのタイミングで(close後に)出力する
<?php
// POSTのサンプル
// 1. curlセッションを初期化する
$ch = curl_init();
// 2. curlオプションを設定する
curl_setopt($ch, CURLOPT_POST,True);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,True);
curl_setopt($ch, CURLOPT_URL, "http://n.hatena.com/applications/start");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: n.hatena.com", "Authorization: OAuth ...(略)");
curl_setopt($ch, CURLOPT_USERAGENT, "ExampleUserAgent/1.0");
// 3. curlを実行する
curl_exec($ch);
// 4. curlセッションを終了する
curl_close($ch);
// 戻り値があればこのタイミングで(close後に)出力する

まとめ:(文字数稼ぎ)

そもそもCURLってなんですか、って話なんですがね。

ja.wikipedia.org

URLを使ってデータのやり取り(GET: 受信/POST: 送信)をする、みたいな理解でいいと思うんですが*4、WebAPIと呼ばれるインターフェースを呼び出すために使う仕組み、とでも理解しておけばいいんではないでしょうかね。

qiita.com

WebAPIをCurlで呼び出して結果を出力する、みたいな感じでプログラムを書くわけですが、そもそも久しぶりにPHPを書いてしかもそれがAPI呼び出し、という、理解はそこそこしているけれど実際の実装ってどうやるんだろう、というところが今回しっかりと理解できたようには思います*5

余談:(さらに文字数稼ぎ(笑))

実はAPIを作る、という構想もあったのです。

racchie.hatenablog.com

この辺のプロジェクトですが、温湿度などを計測してそれを蓄積しているわけですから、その情報を取り出すための手段としてWebAPIを採用しようと考えていました。落ち着いたらプロジェクトを再開させようと思っていますのでAPIの作り方も紹介できるようになるかと思いますが、その時はPHPではなくPythonでのご紹介になるかと思います。

*1:実際には、自分でコードを書くための備忘録や必要な事項のまとめ的な意味合いでこの記事の下書きを書いています。

*2:ググってみても、REST(ful) APIの開発ができるとかいう話はあっても、APIを呼ぶところは今回紹介していないGuzzleかPHP標準のcURL関数を使う記述しかないんですよね。

*3:はてブロで記事を書いているのでせっかくですから、という意味です。Qiitaとかも考えたんですが、私自身はQiitaに投稿をしたことがないので呼び出すサンプルすらないですしね。

*4:正直言うとこの辺はあまり深く理解をしていないです。しなくても使えればいいかな、くらいに思っていますが、本当にそれでいいのかな...。

*5:サンプルコードを見る限りでは理解が深まっているようには見えないですが、実際に納入したコードに関してはキチンと理解したうえで書きましたよ。