JavaアプリケーションからGoogle URL Shortener APIを使用する

# 概要

Javaアプリケーションより、Google URL Shortener APIを使用するサンプルアプリケーションです。認証にAPIキーとサービスアカウントによる2つの方法を試しました。

**環境**

* Windows7 (64bit)
* Java 1.8.0_65

**参考**

* [URL Shortener API Client Library for Java] (https://developers.google.com/api-client-library/java/apis/urlshortener/v1)
* [Using OAuth 2.0 with the Google API Client Library for Java] (https://developers.google.com/api-client-library/java/google-api-java-client/oauth2)
* [Integrate Google URL Shortener API in your Java Applications using Scribe-Java and GSon] (http://newlynulled.blogspot.in/2015/05/integrate-google-url-shortener-api-in.html)


## 準備

まず、[Google Developers Console] (https://console.developers.google.com/home)にアクセスしてキーの作成とAPIの有効化を行います。

### プロジェクトの作成

テスト用のプロジェクトを作成します。(既存にテストで使用できるプロジェクトがあればそれを使ってもかまいません)
`プロジェクトを作成`をクリックしプロジェクト名を入力します。

![a01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/984ca61b-3e94-5612-5370-7a8ce1b9e392.png)

今回は`My-API-Test Porject`としました。
プロジェクトが作成されるとダッシュボードに移動します。

![a02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f1c87589-6d57-1fed-bfa6-140c5e0a8116.png)

### APIの有効化

URL Shortener APIを有効化します。

![a03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/dd880aab-06bc-4c2f-d2a9-3b3c1c6cb425.png)

![a04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4a09bd06-b96e-c85d-d06a-6d3d1c4165c1.png)

![a05.png](https://qiita-image-store.s3.amazonaws.com/0/22772/05211dc1-c3d4-a65e-0b36-602a20bead31.png)

### OAuth同意画面の設定画面

プロジェクトのOAuth同意画面の設定がまだの場合は、最初に設定を行っておく必要があります。
新規に作成したプロジェクトなので設定を行いました。サービス名に適当な名前を入力して保存します。

![a07.png](https://qiita-image-store.s3.amazonaws.com/0/22772/079381fe-ecf1-ee71-7cf4-01a33f12c983.png)

### キーの作成

APIキーとサービスアカウントキーを作成します。

**APIキー**

![a08.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4def6a04-efe4-0817-b1c2-7fe2a8577bd8.png)

名前を付けて作成するとAPIキーが発行されます。

![a10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/54b975eb-b340-e0d1-c3d6-50be46d03862.png)

**サービスアカウントキー**

![a11.png](https://qiita-image-store.s3.amazonaws.com/0/22772/88b7aa7b-b490-8ffc-d170-86c24436aa26.png)

名前を付けキーのタイプにP12を選択して作成します。
続いてキーファイルのダウンロードが始まります。

![a12.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3bdb2303-93fe-085e-759b-d71144064da6.png)

サービスアカウントのメールアドレスを確認します。

![a13.png](https://qiita-image-store.s3.amazonaws.com/0/22772/59d85191-d3d0-d13c-692a-587aed2b52e7.png)

モザイクにしていますが、メールアドレス欄に記載されている文字列がサービスアカウントのメールアドレスです。

![a14.png](https://qiita-image-store.s3.amazonaws.com/0/22772/dac1388f-d49e-825c-1c2e-00dc089c0715.png)


## アプリケーションの開発

### 使用するライブラリ

pom.xmlに下記の依存関係を追加します。

```xml:pom.xml
<dependency>
  <groupId>com.google.apis</groupId>
  <artifactId>google-api-services-urlshortener</artifactId>
  <version>v1-rev41-1.21.0</version>
</dependency>
```

**resourcesフォルダの作成**

src/main/resourcesフォルダを作成しここにダウンロードしたP12ファイルを配置します。


### APIキーを使うサンプル

```java
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.urlshortener.Urlshortener;
import com.google.api.services.urlshortener.UrlshortenerRequestInitializer;
import com.google.api.services.urlshortener.model.Url;

/**
 * API KEY サンプル
 */
public class Sample2 {

  //アプリケーション名 (任意)
  private static final String APPLICATION_NAME = "urlshortener-application-example/1.0";

  private static final String API_KEY = "取得したAPIキーの値";

  public static void main(String[] args) {
    Sample2 sample = new Sample2();
    String longUrl = "http://qiita.com/rubytomato@github";

    try {
      UrlshortenerRequestInitializer initializer = sample.authorize();
      Urlshortener service = sample.getService(initializer);
      Url shortUrl = sample.getShortUrl(service, longUrl);
      //getId()値が短縮URLです
      System.out.println(shortUrl.getId());
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  private Url getShortUrl(Urlshortener service, String longUrl) throws Exception {
    System.out.println("getShortUrl in");

    Url url = new Url().setLongUrl(longUrl);
    Url result = service.url().insert(url).execute();

    return result;
  }

  private UrlshortenerRequestInitializer authorize() throws Exception {
    System.out.println("authorize in");

    return new UrlshortenerRequestInitializer(API_KEY);
  }

  private Urlshortener getService(UrlshortenerRequestInitializer initializer) throws Exception {
    System.out.println("service in");

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    Urlshortener service = new Urlshortener.Builder(httpTransport, jsonFactory, null)
      .setUrlshortenerRequestInitializer(initializer)
      .setApplicationName(APPLICATION_NAME)
      .build();

    return service;
  }

}
```

### サービスアカウントを使うサンプル

```java
import java.io.File;
import java.util.Set;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.urlshortener.Urlshortener;
import com.google.api.services.urlshortener.UrlshortenerScopes;
import com.google.api.services.urlshortener.model.Url;

/**
 * サービスアカウントキー サンプル
 */
public class Sample3 {

  //アプリケーション名 (任意)
  private static final String APPLICATION_NAME = "urlshortener-application-example/1.0";

  private static final String ACCOUNT_ID = "サービスアカウントのメールアドレス";
  private static final File P12FILE = new File("src/main/resources/ダウンロードしたp12ファイル");

  //認証スコープ
  private static final Set<String> SCOPES = UrlshortenerScopes.all();

  public static void main(String[] args) {
    Sample3 sample = new Sample3();
    String longUrl = "http://qiita.com/rubytomato@github";

    try {
      Credential credential = sample.authorize();
      Urlshortener service = sample.getService(credential);
      Url shortUrl = sample.getShortUrl(service, longUrl);
      //getId()値が短縮URLです
      System.out.println(shortUrl.getId());
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  private Url getShortUrl(Urlshortener service, String longUrl) throws Exception {
    System.out.println("getShortUrl in");

    Url url = new Url().setLongUrl(longUrl);
    Url result = service.url().insert(url).execute();

    return result;
  }

  private Credential authorize() throws Exception {
    System.out.println("authorize in");

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(ACCOUNT_ID)
      .setServiceAccountPrivateKeyFromP12File(P12FILE)
      .setServiceAccountScopes(SCOPES)
      .build();

    boolean ret = credential.refreshToken();
    System.out.println("refreshToken:" + ret);

    // debug dump
    if (credential != null) {
      String accessToken = credential.getAccessToken();
      Long expires = credential.getExpiresInSeconds();
      System.out.println("AccessToken:" + accessToken);
      System.out.println("expires:" + expires);
    }

    return credential;
  }

  /**
   * 保存していたアクセストークンからcredentialを生成することができます 
   */
  private GoogleCredential makeCredential(String accessToken) {
    System.out.println("makeCredential in");

    GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);

    if (credential != null) {
      accessToken = credential.getAccessToken();
      Long expires = credential.getExpiresInSeconds();
      System.out.println("AccessToken:" + accessToken);
      System.out.println("expires:" + expires);
    }

    return credential;
  }

  private Urlshortener getService(Credential credential) throws Exception {
    System.out.println("service in");

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    Urlshortener service = new Urlshortener.Builder(httpTransport, jsonFactory, credential)
    .setApplicationName(APPLICATION_NAME)
    .build();

    return service;
  }

}
```