Google App Engine(GAE)から外部のネットワークへ接続する際の注意
Google App Engine(GAE)の開発環境の移行の際にJava 7からJava 8へ移行しました。その際、GAEから、java.net.URL.openConnectionを使って普通に外部ネットワークのAPIを呼び出そうとすると下記のエラーが発生するようになってしまいました。
java.net.UnknownHostException: ホスト名いろいろ調べていくと、下記のページにたどり着きました。
https://cloud.google.com/appengine/docs/standard/java/issue-requests
上記の表を間単に日本語訳すると
URLのフェッチ方法 | Java 7 | Java 8 |
---|---|---|
UrlFetch API Calls | com.google.appengine.urlfetch.*以下のクラスを使う。無料で使用できる部分あり。 | com.google.appengine.urlfetch.*以下のクラスを使う。無料で使用できる部分あり。 |
Javaネイティブのjava.net.URL.openConnectionなどを使う方法 | 無料ユーザも制限なく利用可能。 | 無料ユーザは、利用不可。 java.net.UnknownHostException、java.net.SocketTimeoutException、java.io.IOException とかが投げられる。 |
- GAEで外部ネットワークへアクセスする方法には「GAEが提供するUrlFetch API Calls」「Javaネイティブのjava.net.URL.openConnection」の2つ方法がある。
- Java 7では、「GAEが提供するUrlFetch API Calls」「Javaネイティブのjava.net.URL.openConnection」は無料でどちらの方法も利用可能。
- Java 8で無料で利用できるのは「GAEが提供するUrlFetch API Calls」のみ。
- Java 8で「Javaネイティブのjava.net.URL.openConnectionの方法」は課金ユーザーのみ利用可能。
コードの変更
変更前: Java Nativeのjava.net.URL.openConnectionを使う方法
import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; // 余計な部分も混じっていますが、外部のデータをbyte[]形式で取得するコード public static byte[] readAsBytes(final String urlStr) throws MalformedURLException, URISyntaxException, IOException, ProtocolException { URL url = new URI(urlStr).toURL(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.connect(); byte[] bytes = toBytes(connection.getInputStream(), 2000); connection.disconnect(); return bytes; }
変更後: Java Nativeのjava.net.URL.openConnectionを使う方法
import com.google.appengine.api.urlfetch.URLFetchService; import com.google.appengine.api.urlfetch.URLFetchServiceFactory; public static byte[] readAsByte(String urlStr) throws MalformedURLException, IOException { URLFetchService service = URLFetchServiceFactory.getURLFetchService(); HTTPResponse response = service.fetch(new URL(urlStr)); return response.getContent(); }
コメント
Passing arrays and individual array elements to methods