PHPを使ってWebAPIの呼び出しを行うという仕事を受注しました。契約の関係上ソースをそのまま掲載することはできませんが、参考になるコードをいくつか書いていますので参考になれば幸いです。
また、WebAPIの呼び出しをする時に注意することについても少し触れたいと思っています。どっちかと言うと注意点のほうがメインコンテンツになるのかも...。*1
事前に知っていてほしいこと
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に数値を設定するオプション
- CURLOPT_CONNECTTIMEOUT:コネクションタイムアウトの秒数を設定
- $valueに文字列を設定するオプション
- $valueに配列を設定するオプション
- CURLOPT_HTTPHEADER:HTTPヘッダ。
array('Content-type: text/plain', 'Content-length: 100')
といった感じ。
- CURLOPT_HTTPHEADER:HTTPヘッダ。
データの送信(POSTメソッド)
POSTの場合はそれほど多くない、というよりは、POSTメソッドで送信するデータの指定を文字列として指定して「POST」すればいい、という認識でいたりします。 * $valueにbool値を設定するオプション * CURLOPT_POST:Trueに設定するとPOSTメソッドを実行する。 * $valueに文字列を設定するオプション * CURLOPT_POSTFIELDS:送信するデータの実態。
データ取得/送信サンプル
せっかくなんで*3はてなとか使ってみましょうか。特定の投稿を取得するとかいう時に使うわけですよ。で、GET/POSTのサンプルとして使えそうなのが、ここ。
<?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ってなんですか、って話なんですがね。
URLを使ってデータのやり取り(GET: 受信/POST: 送信)をする、みたいな理解でいいと思うんですが*4、WebAPIと呼ばれるインターフェースを呼び出すために使う仕組み、とでも理解しておけばいいんではないでしょうかね。
WebAPIをCurlで呼び出して結果を出力する、みたいな感じでプログラムを書くわけですが、そもそも久しぶりにPHPを書いてしかもそれがAPI呼び出し、という、理解はそこそこしているけれど実際の実装ってどうやるんだろう、というところが今回しっかりと理解できたようには思います*5。
余談:(さらに文字数稼ぎ(笑))
実はAPIを作る、という構想もあったのです。
この辺のプロジェクトですが、温湿度などを計測してそれを蓄積しているわけですから、その情報を取り出すための手段としてWebAPIを採用しようと考えていました。落ち着いたらプロジェクトを再開させようと思っていますのでAPIの作り方も紹介できるようになるかと思いますが、その時はPHPではなくPythonでのご紹介になるかと思います。
*1:実際には、自分でコードを書くための備忘録や必要な事項のまとめ的な意味合いでこの記事の下書きを書いています。
*2:ググってみても、REST(ful) APIの開発ができるとかいう話はあっても、APIを呼ぶところは今回紹介していないGuzzleかPHP標準のcURL関数を使う記述しかないんですよね。
*3:はてブロで記事を書いているのでせっかくですから、という意味です。Qiitaとかも考えたんですが、私自身はQiitaに投稿をしたことがないので呼び出すサンプルすらないですしね。
*4:正直言うとこの辺はあまり深く理解をしていないです。しなくても使えればいいかな、くらいに思っていますが、本当にそれでいいのかな...。
*5:サンプルコードを見る限りでは理解が深まっているようには見えないですが、実際に納入したコードに関してはキチンと理解したうえで書きましたよ。