日本郵便での日本からのEMS配送料を算出するAPIを公開してみた。

前回の記事に引き続き、 過去の作ったものでブログを書いてみるシリーズの第2弾です。

前回はこっち。 webuilder240.hatenablog.com

前にこの記事を書きましたが、 webuilder240.hatenablog.com

これをAPIで公開しました。 Productionで使われることはそこまで気にしていないんで、HerokuのHobbyインスタンスで適当にやっています。 自前で欲しい場合はHerokuButtonもないので、公開しているリポジトリから適当にやってください。 他の404も手抜きです。今後使う人が増えてくればやろうかなぁと言う感じ。

API: https://from-jp-ems.herokuapp.com

Repo: github.com

使い方

curl -X GET https://from-jp-ems.herokuapp.com?area=asia&weight=100 | jq

Response

{
  "result": 200,
  "area": "asia",
  "weight": 100,
  "amount": 1400
}

ざっくり仕様

  • weightは数値型で1〜30000のグラム単位の値。
  • area は “asia”, “oceania”, “north_america”, “middle_east”, “central_america”, “europa”, “africa”, “south_america"のいずれか。

料金表についてはをここを参照してください。(エンドポイントを追加しようかな。) www.post.japanpost.jp

ちょっと工夫した点

ほとんど算出するロジックはGemで実装しているし、ほとんどやることは無かったと言っても過言ではない。 まぁでも若干苦労したところがあったので、簡単に書いておく。

weightが文字列だったときの対応

このAPIの場合、weightに渡すパラメータは数値型、Integerである必要がある。 なのでざっくりIntegerに変換する方法をとった。 ちなみにto_iだったら、"100kg"がパラメータとして渡ったときに100と返してしまうので使えなかった。 Integerで変換して文字列だったときはrescueでキャッチして、数値を0にするようにした。(もっと他にありそう。)

  def weight=(value)
    begin
      value = Integer(value)
    rescue TypeError, ArgumentError
      value = 0
    end
    @weight = value
  end

そのうち何らかの形でkg単位のAPIなんかもサポートしたいと思っている。

実行できるメソッド

areaで渡ってきたパラメータをそのままバリデーションして実行したかったので、 ライブラリで定義されているクラスメソッドの一覧を取得して、そのリストでValidateするようにした。 特異メソッドなので、singleton_methodsで取得。 ソースコードで言うとこんなところ。

  ALLOW_AREAS = JpEmsFee.singleton_methods.map(&:to_s)
  validates :area, inclusion: { in: ALLOW_AREAS }

あとはなるべくControllerに処理を書かないようにしたくらい。 本当はDecorator層とかに書けよってものもModelに書いてるけど、 本当に小さなAPIなので気にしない。

反省点・今後のTODO

Docker

今回は面倒だったのでやらなかった。 これは今後Herokuで動かせるようにしつつやっつける。

Rails API

API用途だけなので、Rails API使ってみればよかった。 他の不要なGemを掃除できたのでそのうち対応してみる。

Request Rspec

まだ書いてない。正直書くボリュームでもないかな。とも。

Swagger

使ってみればよかった…

最後に

僕の働いているオシロ株式会社ではエンジニアを募集しています。

手前味噌ですが、面白い福利厚生や会社制度もありますし、 普通のWebサービスではあまりないような課題があるので、Railsをバリバリ書ける環境で、やりがいがあるんじゃないかなと思っています。 Railsを覚えたい他の言語でのご経験のあるエンジニアさんも大歓迎です!!

まずは話を聞いていただけるだけでもとても嬉しいので、まずはWantedlyの募集ページを見てみてください! 何卒よろしくお願いいたします。

www.wantedly.com