目指せプログラマー

アラサーが仕事辞めてプログラマーを目指す

体重計とfitbit連携アプリ作成

こんにちは、最近は龍が如く8にドハマりしてしまい学習がおろそかになっていました。
ストーリークリアだけで70時間かかりましたが面白かったのであっという間に感じました。

さて、今回作成したのは体重計のデータをFitBitアプリに移行させるプログラムを作成しました。

作成に至った経緯

最近は体に気を使って、体重を毎日測っているのですが体重計はタニタを使っており、管理にはHealth Planetを使っています。
一方で心拍数や睡眠などの管理にはFitBitを使っており前々から一元管理したいと思っていたのでこれまで学習した内容にを活かして作成しようと思いました。

使用している機器

作成準備

作成するにあたって両サイトのAPIを使用するため、それぞれ登録を行いました。

Fitbit

APIを使用するためにアプリ登録を行いました。

参考にしたサイトは下記になります。

www.zenryoku-kun.com

ヘルスプラネット

Fitbitと同等に登録しました。

zenn.dev

 

完成品

github.com

プロパティファイルに両サイトのトークンを記述することで使用できるようにしてます。

Fitbitの方は8時間でアクセストークンが切れる為、リフレッシュトークンで適宜アクセストークンを取得するようにしました。

ヘルスプラネットで取得できるの期間設定3か月前~現在としており、それ以上遡るにはプログラムを直接変えるしかないです。

 

作成に当たり引っかかった点や反省点

初めにcurlで確認する

多分基本的なことだとは思いますが、最初にコードでリクエストを作成する前にcurlで確認するべきだと思いました。

コードでリクエスト作って送ってもエラーが出ることが多々ありましたがその原因としてクエリパラメータが違ったりトークンが違ったりがあったのでまずはcurlでパラメータ等の正誤を確認して問題なくレスポンスが返ってきた場合にそのリクエストをコードで表現せるのが一番正確で早いと痛感しました。ほんとに・・

Fitbitにデータを送信するリクエストエラー

体重などのデータをリクエストのPOSTメソッドで送信するにあたっての必須項目の一つとして「content-length」があり、データはクエリパラメータで送信するため0と記載して送信してもエラーが発生。

調べたらcontent-lengthは自動で計算されるとなっていた為、特に何もせずやってもエラー。

結局リクエストのbodyValueメソッドに空文字を入れることで解消されました。

public String createWeight(WebClient client, double weight, String date, String time) {
    //URLの生成
    String url = UriComponentsBuilder.fromUriString("https://api.fitbit.com/1/user/-/body/log/weight.json")
    //体重
    .queryParam("weight", weight)
    //測定日
    .queryParam("date", date)
    //測定時間
    .queryParam("time", time)
    .build().toString();
    //リクエストを生成しPOSTメソッドで送信
    String createData = client.post().uri(url)
    .header("authorization", "Bearer " + accessToken)
    .header("accept", "application/json")
    //ここを記載したらエラー解消した
    .bodyValue("")
    .retrieve().bodyToMono(String.class).block();
    return createData;
}

今回作成してみて

今まで学習してきてやっと自分でこうできたらいいなってことがプログラムで実現できたと思います。まだまだ改善の余地がありすぎるぐらいですが勉強の成果が出ているとプラスにとらえてこれからも頑張っていきます。