今回は、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アカウント毎に固有のキーですので、他の人に利用されないように注意しましょう。
以上です。