Google App EngineでURL短縮サービスAPIを利用する


今回は、Google App Engine を利用して、URL短縮APIを利用してみたいと思います。
URL短縮サービスは、URLを短くしてくれるWebサービスで、p.tlやbit.lyなどが有名です。
たとえば、Low Level APIでGAEのデータストアにアクセスする記事のURL「https://techbooster.org/gae/9369/」を短縮すると、「http://p.tl/OQO9」となります。少し短くなりましたね。
Googleからは、URL短縮サービスとして「goo.gl」が公開されています。
「goo.gl」からはURLを短縮するためのAPIが公開されており、Google App Engineからも利用することができます。
今回は、「goo.gl」のURL短縮APIをGoogle App Engineから利用する方法について解説します。

URL短縮APIを利用するためのポイントは、以下の情報をHTTPリクエストとして送信し、レスポンスを得ることです。
レスポンスの中に短縮されたURLが含まれています。

POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json

{"longUrl": "(短縮したいURL)"}

また、今回URLへアクセスする際にgetURLFetchServiceクラスを利用します。
getURLFetchServiceクラスは、外部URLにアクセスすることのできるクラスです。
それでは以下で詳しく見て行きます。

URL短縮サービスの仕組み

まずは簡単に、今回解説するURL短縮APIを利用した場合に想定されるURL短縮サービスについて簡単に解説します。
URL短縮APIは、指定のURLにHTTPリクエストを送信してAPIにアクセスし、短縮されたURLをHTTPレスポンスとして取得するという形で利用します。
まずは下図を見てみてください。

サービスを利用するユーザーは、短縮したいURLをブラウザの画面上に入力して送信します(①)。
ユーザー入力情報を、自前で用意したサーバー(ここではURLを「http://hoge/」)で受け取ります(②)。
短縮したいURLを受け取ったら、それをURLを短縮する仕組みを持っているサーバー(URL「https://www.googleapis.com/urlshortener/v1/url」に送信します(③)。
送信する際のHTTPリクエストの形式は決まっており、以下のようにする必要があります。

POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json

{"longUrl": "(短縮したいURL)"}

[table “223” not found /]

上記のようにHTTPリクエストを送信すると、
URLの短縮処理やリダイレクトはURL短縮APIが行ってくれます(④)。
あとはJSON形式で送られてくる短縮されたURLをレスポンスとして受け取り(⑤)、それをユーザーに返します(⑥)。
ユーザーは短縮されたURLにアクセスすると、短縮前のURLに自動的にリダイレクトされます(⑦)。
リダイレクトの仕組みもサーバー側で用意されています。
つまり、goo.glのURL短縮APIを利用すれば、URLの短縮やリダイレクト処理を自分で実装する必要なくURL短縮サービスを作成することができます。

今回解説するのは、URLの短縮処理を行ってくれるAPIをGoogle App Engineから利用する方法です。
短縮したいURLを図中④のサーバーに送信し、短縮されたURLを受け取ります。
※ユーザーの入力を受け付ける画面およびユーザー入力情報を受け取る方法については実装・解説していませんのでご容赦ください。

HTTPリクエストを行う

それではソースコードを順番に見て行きます。
今回はHTTPリクエストを行うためにURLFetchServiceクラスを用います。
URLFetchServiceを用いると、外部のURLに対してHTTPリクエストを行い、その結果(HTTPレスポンス)を得ることができます。
以下のソースコードをみてください。

UrlShorterSampleServlet.java

public class UrlShorterSampleServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");

		String longUrl = "{\"longUrl\": \"" + "https://techbooster.org" + "\"}";

		URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();

		URL url = new URL("https://www.googleapis.com/urlshortener/v1/url");
		HTTPRequest httpReq = new HTTPRequest(url, HTTPMethod.POST );
		httpReq.addHeader(new HTTPHeader( "Content-Type", "application/json" ));
		httpReq.setPayload( longUrl.getBytes() );

		HTTPResponse response = ufs.fetch( httpReq );

		byte[] content = response.getContent();
	        String json = new String( content, "UTF-8" );

		resp.getWriter().println(json);

	}
}

まず、8行目でURLFetchServiceFactoryクラスのgetURLFetchServiceメソッドを用いてURLFetchServiceクラスのインスタンスを生成します。
生成したインスタンスufsは、fetchメソッドを用いてHTTPRequestクラスを引数に外部APIへのアクセスを行います。
10行目〜13行目までで、リクエスト内容の構築を行っています。
10行目でリクエスト先のURLを指定しています。URLは以下を指定する必要があります。
“https://www.googleapis.com/urlshortener/v1/url”
11行目でリクエスト先のURLとHTTPメソッド(POST)を指定してHTTPRequestクラスのインスタンスを生成します。HTTPRequestクラスは、HTTPリクエストを構築するためのクラスです。リクエスト先URLやヘッダ情報、送信データなどをHTTPリクエストとして構築することができます。
12行目でHTTPRequestクラスのaddHeaderメソッドを用いてヘッダ情報を追加しています。Content-Typeにはapplication/jsonを指定し、送信する情報がJSON形式であることを知らせます。
13行目でHTTPRequestクラスのsetPayloadメソッドを利用して短縮したいURLを送信データとしてセットします。
なお、短縮したいURLは以下のようにJSON形式で記述します(6行目)。
{“longUrl”: “(短縮したいURL)”}

あとは15行目でURLFetchServiceFactoryクラスのfetchメソッドの引数に、生成したHTTPRequestのインスタンスを指定することでHTTPリクエストを送信し、返り値としてHTTPレスポンスを得ます。

すると、以下のようにJSON形式で短縮されたURLがHTTPレスポンスとして返されます。

“id”に指定されているのが短縮後のURLになります。

APIキーの取得

前述のソースコード10行目で指定したリダイレクト先URLですが、公式サイトでは、以下のようにURLの最後にAPIキーを付加することを推奨しています。
“https://www.googleapis.com/urlshortener/v1/url?key=(APIキー)”
APIキーを指定することで、goo.gl全体でユニークな短縮URLを生成することができます。

APIキーはAPIs Consoleから取得できます。
API Consoleは、Googleの各種APIを利用するためのコンソール画面で、Googleアカウント毎に与えられます。
APIの有効/無効の切り替え、APIキーの取得など、GoogleのAPIを利用する上で必要な情報を管理できます。
「API Access」に記載されています。

APIキーを用いてアクセスを行う場合は、下図のように事前に「URL Shortener API」のAPIサービスを有効にする必要があります。




また、APIキーはGoogleアカウント毎に固有のキーですので、他の人に利用されないように注意しましょう。

以上です。

One Comment