[PHP] 外部APIからファイルデータを取得した時の振る舞いについて

2018年9月13日

PHP テクノロジー プログラミング

外部API使うと手早く便利なサービスが構築できます。 WEBページでグラフ表示をしたい場合はGoogleChartを使えば、簡単に綺麗なUIが構築できるし、 書籍情報などはopenBDというサービスで簡単に取得できて活用できてしまいます。 昨今のWEBサービスは、何かのデータを取得して、特定の条件で任意の結果を返すという簡易な物でも、アプリで実現すると便利に使える人も多く、まだ無いサービスを作るだけで、世の中で活用される可能性は高いという時代です。 スマートフォンという、PCと同じようなアクセスと結果が得られるデバイスが世の中のほとんどの人が手にしている状態が、こうしたAPIの加速を促しているのは間違いありません。 そうしたAPIを利用するときに、画像や動画、音楽などのバイナリデータや、ビジネスにおいてもPDFデータやzipファイルなど、多数のファイルを扱うことも多くなってきました。 サーバーサイドでPHPを使って、こうしたバイナリファイルを上手に扱えるやり方を知っておくだけで、より手軽にAPiを利用できるようになるので、やり方などを残しておきます。

データのPOST送信してからデータ取得

まず、APIサービスへのアクセスや認証、データ取得の際のクエリ送信は、POST送信で行う場合が多いので、PHPサーバー側からのPOST送信をするソースは以下の通りです。 $query = array( "id" => "ore", "pass" => "password", "data" => "keyword" ); $options = array("http" => array( "header" => implode("\r\n", $headers), "method" => "POST", "content" => http_build_query($query) )); $response = file_get_contents("http://hoge.com/" , false , stream_context_create($options)); 上記は、とあるAPIに対して、IDとPasswordと任意のdataをkey情報として受け渡して、$dataに返り値を取得するやり方になります。 javascriptのajaxでpost送信しようとすると、サーバーセキュリティにひっかかる可能性が高いので、JS側から、同じサーバー内に設置したPHP経由で、APIデータ通信を行うのが手際のいい方法だと思います。 API側でJSからのPOST受診を許可している場合は、こんなめんどくさい手順はいらずにjQueryなどでPOST送信するだけでもいいのですが、今回はcronバッチなどで便利に使えるようにPHPでの処理を行います。

header情報も取得する

上記プログラムで、データの中身だけ変えれば何が返ってくるか、分かっている場合はいいのですが、ファイルタイプや、容量などを知りたい場合は、header情報も同時に取得する事で、便利にそのごの扱いにも便利に影響します。 $header = getHeaderInfo($http_response_header); // header情報の取得 function getHeaderInfo($http_response_header){ $arr = array(); for($i=0; $i<count($http_response_header); $i++){ $sp = explode(":",$http_response_header[$i]); $arr[$sp[0]] = trim($sp[1]); } return $arr; } 上記の$data取得と同時に、このソースコードと関数を追加しておくと、ヘッダとデータ内容が同時に取得できます。 ちなみに、headerファイルは以下のようなデータ取得ができます。 Array ( [HTTP/1.1 200 OK] => [Date] => Mon, 10 Sep 2018 09 [Server] => Apache/2.2.22 (Unix) PHP/5.4.5 mod_ssl/2.2.22 OpenSSL/0.9.8q [X-Powered-By] => PHP/5.4.5 [Cache-Control] => no-cache, no-store, max-age=0, must-revalidate; [Pragma] => no-cache [Expires] => Mon, 26, Jul 1997 05 [Content-Disposition] => attachment; filename=hoge.zip [Content-Length] => 8069 [Connection] => close [Content-Type] => application/zip ) zipファイルでデータが返ってきた事がわかります。 このデータを元に、以下のようにヘッダ設定をすると、ブラウザでは自動的にダウンロード処理に移行します。 $data = getDocument($url , $query); header("Content-Type: ".$data["header"]["Content-Type"]); echo $data["data"]; getDocument関数は、上記のPOSTが書かれている関数を作って上げるといいでしょう。 このようなPHPでの簡単なAPIへの送信から、受信、ブラウザへの受け渡しなど、色々と工夫次第でUXなどにも活用できると思います。 まずは、こうした工程でつまずかないように、上記処理を理解しておきましょう。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。