HitoHana(ひとはな)の舞台裏

HitoHana(ひとはな)運営の舞台裏をご紹介いたします!

RMSのAPIをRubyで実装したい 1/3

発端

新人の田中です。HitoHanaは、楽天でもお店を出してます!
で、本家のECサイトと楽天の店舗とのデータのやりとりを手軽にやりたいってことで、RMS(Rakuten Marchant Service)のWEBAPIサービスを利用してみようってことになりました。
この記事では3回に分けてRMSの受注APIをRailsアプリケーションに導入した事例を紹介します。

イチから実装してみることに

APIサービスの利用は決まったんですが、Rubyで実装されてる参考ソースがなかなか見つからず、本家もJavaしか書いてないんでイチから実装してみることにしました。

完成形のイメージ

新人の僕がいきなり実装するとごっちゃごちゃになっちゃうので、まずは完成形をイメージします。
外部のシステム(RMS)と自社システム(HitoHana)をスムーズにつなげられるように緩衝材(Proxy)を用意することにしました。

  1. モデル層:HitoHanaのRailsアプリケーションのモデルです。基本ここはさわらない感じにしたい。

  2. サービス層:HitoHanaとRMSのAPI(ライブラリ層)をつなぐProxyです。HitoHanaアプリのモデルをこのProxyに渡してRMSのAPIをコントロールします。

  3. ライブラリ層:RMSのWEBAPIをRubyで使うためのモジュールです。

でもまずはとりあえずつなげよう

完成形のイメージはつくってみたけど、でもそもそもRMSのAPIを呼び出せないとお話にならないので、完成形のイメージはいったんほっといて、単純に楽天の注文の情報だけを取得するコードを書いてみます。
RMSの受注APIはSoapを使用しているのでSoap通信のgemとしてSavonを使いました。

github.com

require 'base64'
require 'savon'

# 初期設定
service_secret = 'WEB API契約時に配布されるサービスシークレット'
license_key    = 'WEB API契約時に配布されるライセンスキー(有効期限付き)'
shop_url       = '楽天の店舗URL'

# 受注APIのうち、試しにgetOrderを使うことにした
operation = :get_order
message = {
  # 認証系パラメタ
  # user_nameはタグとしては必須だが、入力不要らしい
  arg0: {
    auth_key: "ESA #{Base64.strict_encode64(service_secret + ':' + license_key)}",
    shop_url: shop_url,
    user_name: 'hitohana',
  },
  # 業務系パラメタ
  arg1: {
    is_order_number_only_flag: false,
    order_number: ['楽天の注文番号(やたら長い)'],
  },
}

# Savon client でRMSのAPIを呼び出す
wsdl = 'https://api.rms.rakuten.co.jp/es/1.0/order/ws?WSDL'
client = Savon.client(wsdl: wsdl)

# Debug用コード リクエストのxmlを確認できる
# client.operation(operation).build(message: message).pretty

response = client.call(operation, message: message)
response_body = response.body["#{operation}_response".to_sym][:return]

結果は以下のような感じ

{
    error_code: 'N00-000',
    message: '正常終了',
    order_model: '注文情報のHashインスタンス'
}

うまくいきました。
RubyでRMSのWEB APIを使用できるようになったので次回からは構造的にアプリケーションを作っていきます。
第2回はライブラリ層を実装していく予定です。

おわりに

HitoHana(ひとはな)では、仕事が大好きで個性的なエンジニアを大募集しています!

www.wantedly.com

Google Drive APIを使うときにファイルIDじゃなくてURLを引数にしておくとコミュニケーションがスムーズになるかもしれないというお話

雨の日も晴れの日も

エナジードリンクを飲みすぎて、エナジードリンクを飲んでいないときに気持ちが落ち込んでしまうエンジニアの新原です。

Google Drive

Google Drive、皆さん使っていますか?
僕らのような規模の小さい会社や団体に所属している方であれば、神のようなツールですよね。
今の時代、スケジュールやら仕様やら飲み会候補やら分析結果やら何から何までがGoogle Spread Sheetで飛んできます。

仕事をしているとGoogle Spread Sheetに作成された商品データをシステムに投入するというようなミッションがあったりするので、僕らみたいなエンジニアはRubyから参照できると便利ですよね。
そう、Google Drive REST APIとgemですね!!

developers.google.com

github.com

でも、ちょっと不便。。。

すごく便利なのですが、引数がファイルIDというところに少し不便を感じてしまいます。
エンジニア同士であればファイルIDをやりとりするのは簡単ですが、非エンジニアと会話するときに「Spread SheetのファイルIDを教えて!」と言っても伝わらないときがあります。
URL階層を説明したあとで「#ditの前のスラッシュまでがファイルIDなので、こちらを...」のような形になっちゃいますね。
非エンジニアからしたら「なんでそんなにめんどくさいことしなきゃいけないの?」「めんどくさジニア!」っていう感じですよね。
「ファイルのURLを教えて!」といえば一発です。めんどくさジニアにもならなくてすみます!

解決策

URLだけをやり取りすればいいので、こんな正規表現をかいてみました。
これをいい感じにどこかのメソッドに設置しておけば、あら不思議!

/^https:\/\/docs.google.com\/spreadsheets\/d\/(?<google_file_id>.+)\/edit/ =~ url

前まではファイルIDを指定してもらっていましたが、このようにURLを指定することでデータの投入ができるようになりました🖖

f:id:nyaahara:20180529150216p:plain

おわりに

HitoHana(ひとはな)では、仕事が大好きで個性的なエンジニアを大募集しています!

www.wantedly.com