Herokuのアドオン、FixieをPlay Frameworkで使う方法

今回はPlay Framework for Java 2.5.3で確認をしています。

Playは2.xでだいぶ動作が異なることがある( https://www.playframework.com/documentation/2.5.x/Migration25 )ので、他の環境ではわかりません。

対応するべきポイントは2点

Proxyを使う場合は起動オプションを追加したProcfileを用意します。

Procfile

web: target/universal/stage/bin/line-bot-trial -Dhttp.port=${PORT} -Dhttp.proxyHost=XXX.usefixie.com -Dhttp.proxyPort=80 -Dhttp.proxyUser=XXX -Dhttp.proxyPassword=XXX

のようにしてオプションを渡して起動します。

https://www.playframework.com/documentation/2.5.x/ProductionHeroku

Controllerでの呼び出し方

JavaでFixieを使うときは https://devcenter.heroku.com/articles/fixie#using-with-java が非常に参考になります。

ただ、せっかくなのでPlay FrameworkではWSClient( https://www.playframework.com/documentation/2.5.x/JavaWS )を使いたいところ。

public class LineBotController extends Controller {

    @Inject
    WSClient ws;

    public Result callback() {
            //Fixieのアドオンを入れると、環境変数にProxyのURLが登録されるので、それを呼び出します。
            URL proxyUrl = new URL(System.getenv("FIXIE_URL"));
            String userInfo = proxyUrl.getUserInfo();
            String encodedAuth = new BASE64Encoder().encode(userInfo.getBytes());
            WSRequest request = ws.url("https://trialbot-api.line.me/v1/events").setHeader("Content-Type", "application/json; charset=UTF-8")
                    .setHeader("X-Line-ChannelID", YOUR_X_LINE_CHANNELID)
                    .setHeader("X-Line-ChannelSecret", YOUR_X_LINE_CHANNELSECRET)
                    .setHeader("X-Line-Trusted-User-With-ACL", YOUR_X_LINE_TRUSTED_USER_WITH_ACL)
                    .setHeader("Proxy-Authorization", "Basic " + encodedAuth).setRequestTimeout(10000);

            ObjectNode result = Json.newObject();
            //resultに適宜データをぶち込みます。

            CompletionStage<WSResponse> post = request.post(result);

        return ok("");
    }

}

Proxy-AuthorizationのHeaderを追加するのが大事な点でしょうか。(起動時のオプションでProxyのusername,passwordを渡しているので、application.confの設定でそのあたりをよろしく処理してくれる方法ありそうではありますが、わかりませんでした。)