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