色聴者判定テスト > 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
に何でも聞いてください。
「このコードのここの意味が分からない」とか、何でも大丈夫ですよ(^-^)