色聴者判定テスト > Google App Engine URLFetchの使い方

Google App Engine URLFetchの使い方

このページでは、URLFetchの簡単な使い方を解説します。

このページの内容で分からないところとかがあったら、@ts_3156 に何でも聞いてください。
「このコードのここの意味が分からない」とか、何でも大丈夫ですよ(^-^)

Google App EngineにはURLFetchと呼ばれる機能があります。この機能を使えば、いろいろなURLからデータを取ってくることができます。 URLFetchを直接使わなくとも、Javaのプログラマでしたら、

BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

または、

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

これらの方法で簡単にURLにアクセスできます。
こういう高機能なクラスもあるのですが、あえてURLFetchを使いたい人のために簡単な使い方を解説します。 ちなみに、url.openStream()、url.openConnection()も内部的にはURLFetchを利用しています。

一応、Google App Engine公式情報のリンクも載せておきます。

URLFetch Java API概要
URL、HttpURLConnectionを使ったURLへのアクセス
URLFetch Java API一覧

普通にURLにアクセスしたいだけの場合は、 『URL、HttpURLConnectionを使ったURLへのアクセス』 このリンクを見てください。POSTメソッドを使ってパラメータを渡す方法が丁寧に解説されています。 URLFetchをあえて使う利点は普通の人にはほとんどないです。

URLFetchをあえて使う利点はほとんどないんですが、URLFetchのFetchAsync()だったら使う価値がむっちゃあります。 このメソッドは非同期で各URLにアクセスできるので、GETメソッドでのアクセスを大量に行う場合はとても高速です。
FetchAsync()の解説ページはこちら 『非同期URLFetchの使い方』 です。

このページの内容で分からないところとかがあったら、@ts_3156 に何でも聞いてください。

URLFetchの具体的なコード

あれこれ説明するよりも具体的なコードを見た方が早いと思うので、サンプルコードを載せてから解説します。

importするのは以下のクラスです。

import com.google.appengine.api.urlfetch.FetchOptions;
import com.google.appengine.api.urlfetch.HTTPMethod;
import com.google.appengine.api.urlfetch.HTTPRequest;
import com.google.appengine.api.urlfetch.HTTPResponse;
import com.google.appengine.api.urlfetch.URLFetchService;
import com.google.appengine.api.urlfetch.URLFetchServiceFactory;

URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();
URL url = new URL("http://www.egotter.com/");
HTTPResponse response = ufs.fetch(url);
byte[] content = response.getContent();

これが必要最小限の構成でURLFetchを使うプログラムです。GETメソッドでurlのコンテンツを取得してきます。

URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();
URL url = new URL("http://www.egotter.com/?user=yamada?id=1234");
HTTPRequest request = new HTTPRequest(url, HTTPMethod.GET);
request.addHeader(new HTTPHeader("original-header", "test"));
HTTPResponse response = ufs.fetch(request);
byte[] content = response.getContent();

ヘッダやパラメータを追加するとこのようになります。GETメソッドなのでURLにパラメータを埋め込みましたが、POSTメソッドの時はどうするんですかね…。 2010年10月の時点では、POSTのパラメータを追加するようなAPIは存在しません。

URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();
URL url = new URL("http://www.egotter.com/?user=yamada?id=1234");
HTTPRequest request = new HTTPRequest(url, HTTPMethod.GET, Builder.disallowTruncate().setDeadline(10.0));
request.addHeader(new HTTPHeader("original-header", "test"));
HTTPResponse response = ufs.fetch(request);
byte[] content = response.getContent();

disallowTruncate()を追加しました。これにより、レスポンスが大きすぎるときはResponseTooLargeExceptionをだすようになります。Exceptionを ださずに大きすぎるレスポンスを切り捨てる場合は、allowTruncate()を使います。
setDeadline(10.0)により、URLFetchのタイムアウト時間を10秒に設定しました。最大が10秒です。デフォルトのタイムアウト時間は5秒です。5秒だとすぐ失敗します。 「Java版のURLFetchにはタイムアウト時間を変更できないバグがある」という解説をたまに見かけますが、2010年10月の時点ではちゃんと10秒に設定できます。

最初の方にも書きましたが、あえてURLFetchを使う理由がない場合は、HttpURLConnectionを使いましょう。POSTメソッドでパラメータを渡すことも 簡単にできますし、絶対こっちの方が楽です。HttpURLConnectionを使ったサンプルコードは、 『URL、HttpURLConnectionを使ったURLへのアクセス』 ここに載っています。

非同期URLFetch

URLFetchをあえて使う利点はほとんどないんですが、URLFetchのFetchAsync()だったら使う価値がむっちゃあります。 このメソッドは非同期で各URLにアクセスできるので、GETメソッドでのアクセスを大量に行う場合はとても高速です。
FetchAsync()の解説ページはこちら 『非同期URLFetchの使い方』 です。

このページの内容で分からないところとかがあったら、@ts_3156 に何でも聞いてください。
「このコードのここの意味が分からない」とか、何でも大丈夫ですよ(^-^)

色聴判定テスト一覧
テストはどれも10分ほどで終わります
推奨環境
・Internet Explorer7以降
・Firefox3以降
判定テストについて
これまでに 1541人 がテストを受けました
09/12/28~12/02/02
更新情報
・12/10/14
twitterの埋め込み方法を更新しました
・12/01/11
共感覚面白ニュースを更新しました
・11/11/03
共感覚面白ニュースを更新しました
・11/04/03
筑波大学新入生向け情報を書きました
・11/03/04
Twitter4j逆引きリファレンス【使い方 やりたいことから見つける】を書きました
もっと見る
知りたい情報募集中
知りたい情報は見つかりましたか? 見つからなかったならご連絡ください。 詳しく調べて、ネットでは見つからないような良質で科学的な情報を掲載いたします。

研究協力者も募集中です!
お問い合わせはこちら