サンプルプログラム
UOM-APIを利用するためのサンプルです。
- 実行環境:Ruby
- Action:自動申請APIテスト
実行ファイル(例:iijuom_rest.rb)と設定ファイル(例:config.rb)が必要です。
APIの実行には、実行ファイルを実行してください。(コマンド例:ruby iijuom_rest.rb)
実行ファイル
下記プログラムを「iijuom_rest.rb」という名前で保存します。
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require "uri"
require "time"
require "cgi"
require "openssl"
require "base64"
require "net/http"
require "net/https"
require "./config"
# リクエストメソッドの設定
METHOD = "POST"
# Signature 生成に用いるハッシュアルゴリズムの設定
SIGNMETHOD = "HmacSHA256"
SIGNVERSION = "2"
##
## Client クラス
##
class Client
# 有効期間を設定(60 * 60 = 3600秒 : 1時間)
DEFAULT_EXPIRE_SECOND = 60 * 60
##
## 初期化メソッド
##
def initialize(opts = {})
# ENDPOINT の設定を変数へ代入
endpoint = opts[:endpoint]
# endpoint 変数が文字列の場合、取得した URI をパースして再代入
endpoint = URI.parse(endpoint) if endpoint.kind_of? String
# URI を各情報に分解してクラス変数へ代入
# ホスト名
@host = endpoint.host
# ポート
@port = endpoint.port
# パス
@path = endpoint.path
# スキーマが https の場合、SSL利用を宣言
@use_ssl = endpoint.scheme == "https"
# Content-Type をクラス変数へ代入
@content_type = opts[:content_type]
# API バージョンをクラス変数へ代入
@api_version = opts[:api_version]
# アクセスキー情報をクラス変数へ代入
@access_key = opts[:access_key]
# シークレットキー情報をクラス変数へ代入
@secret_key = opts[:secret_key]
# ハッシュアルゴリズム情報をクラス変数へ代入
@sign_method = opts[:sign_method]
@sign_version = opts[:sign_version]
# CA 証明書ディレクトリ情報をクラス変数へ代入
@ca_path = opts[:ca_path]
# CA 証明書ファイル情報をクラス変数へ代入
@ca_file = opts[:ca_file]
# SSL クライアント証明書チェックの真偽値をクラス変数へ代入
@ssl_no_verify = opts[:ssl_no_verify]
end
# インスタンス変数への参照のために、アクションメソッドを指定
attr_reader :host
attr_reader :port
attr_reader :path
attr_reader :access_key
attr_reader :secret_key
##
## GET リクエスト実行メソッド
##
def request_get(action, params, opts = {})
request("GET", action, params, opts)
end
##
## POST リクエスト実行メソッド
##
def request_post(action, params, opts = {})
request("POST", action, params, opts)
end
##
## リクエスト処理メソッド
##
def request(method, action, params, opts = {})
# リクエスト情報を生成して変数へ代入
req = make_request(method, action, params, opts)
# リクエストを生成して変数へ代入
http = Net::HTTP.new(@host, @port)
# SSL利用が宣言されている場合
if @use_ssl
# SSL利用を有効化
http.use_ssl = true
# CA 証明書ディレクトリが指定されている場合、ディレクトリパスを設定
http.ca_path = @ca_path if @ca_path
# CA 証明書ファイルが指定されている場合、ファイルパスを設定
http.ca_file = @ca_file if @ca_file
# SSL 証明書チェックの無効化を確認
if @ssl_no_verify
# 無効化が設定されている場合、チェックを行わない
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
else
# 無効化が設定されていない場合、チェックを行う
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
end
# リクエストを実行
http.start {|conn| http.request(req)}
end
##
## リクエスト生成メソッド
##
def make_request(method, action, params, opts = {})
# 現在時刻から1時間後を有効期間として、変数へ代入
expires = Time.now + DEFAULT_EXPIRE_SECOND
# 有効期間を XML Schema で定義された UTC 時間形式で返却
expires = expires.utc.xmlschema
# Signature 計算用ヘッダ情報を生成して変数に代入
str = make_canonicalized_string(method, expires, @content_type, @sign_method, @sign_version, @path)
# Signature を生成して変数へ代入
signstr = generate_signature(str)
# メソッドが POST ならば、リクエスト情報を生成する
if method == "POST"
req = Net::HTTP::Post.new(@path)
req["Content-Type"] = @content_type
req["x-iijapi-Expire"] = expires
req["x-iijapi-SignatureMethod"] = @sign_method
req["x-iijapi-SignatureVersion"] = @sign_version
req["Authorization"] = "IIJAPI #{@access_key}:#{signstr}"
req.body = params
end
# リクエスト情報を返却
req
end
##
## Signature 計算用ヘッダ生成メソッド
##
def make_canonicalized_string(method, expires, content_type, signmethod, signversion, path)
# ヘッダ文字列を生成して返却
[
method,
"",
content_type,
"x-iijapi-expire:#{expires}",
"x-iijapi-signaturemethod:#{signmethod}",
"x-iijapi-signatureversion:#{signversion}",
path
].join("\n")
end
##
## Signature 生成メソッド
##
def generate_signature(str)
digest_method = OpenSSL::Digest::SHA256.new
digest = OpenSSL::HMAC.digest(digest_method, @secret_key, str)
Base64.encode64(digest).chomp
end
##
## URL エンコード実行メソッド
##
def url_encode(str)
# URLエンコードして返却
CGI.escape(str).gsub('+', '%20').gsub('%7E', '~')
end
end
##
## opts 変数へシンボルで値を設定
##
opts = {
:endpoint => "#{IIJAPI_ENDPOINT}/r/#{APIVERSION}/#{ACTION}.json",
:access_key => IIJAPI_ACCESS_KEY,
:secret_key => IIJAPI_SECRET_KEY,
:content_type => CONTENTTYPEVALUE,
:api_version => APIVERSION,
:sign_method => SIGNMETHOD,
:sign_version => SIGNVERSION
}
##
## オリジナルの CA 証明書ファイル指定
##
if ca_file = ENV["IIJAPI_CA_FILE"]
# IIJAPI_CA_FILE が環境変数に指定されている場合、処理を続行
unless File.exists? ca_file
# 環境変数に指定されたファイルが存在しない場合、例外を出力して終了
raise ArgumentError, "[Error] CA file not found: #{ca_file}"
end
# opts 変数へオリジナルの CA 証明書ファイルパスを代入
opts[:ca_file] = ca_file
end
##
## オリジナルの CA 証明書ディレクトリ指定
##
if ca_path = ENV["IIJAPI_CA_DIRECTORY"]
# IIJAPI_CA_DIRECTORY が環境変数に指定されている場合、処理を続行
unless Dir.exists? ca_path
# 環境変数に指定されたファイルが存在しない場合、例外を出力して終了
raise ArgumentError, "[Error] CA directory not found: #{ca_path}"
end
# opts 変数へオリジナルの CA 証明書ファイルパスを代入
opts[:ca_path] = ca_path
end
##
## デフォルトの CA 証明書ファイル指定
##
if File.exists? OpenSSL::X509::DEFAULT_CERT_FILE
# デフォルトの CA 証明書ファイルが存在し、opts[:ca_file] が未定義ならばデフォルトの CA 証明書ファイルを代入する
opts[:ca_file] ||= OpenSSL::X509::DEFAULT_CERT_FILE
end
##
## SSL クライアント証明書のチェック無効化
##
if IIJAPI_SSL_NO_VERIFY
# IIJAPI_SSL_NO_VERIFY 変数が true の場合、opts 変数へ true を代入
opts[:ssl_no_verify] = true
end
##
## メイン処理
##
# Client クラスを生成
client = Client.new(opts)
# 実行したいアクションを設定
action = ACTION
# 実行するメソッドを確認
if METHOD == "POST"
# POST が指定されている場合、POST で処理を実行しレスポンスを取得
res = client.request_post(action, PARAMS)
elsif METHOD == "GET"
# GET が指定されている場合、GET で処理を実行しレスポンスを取得
res = client.request_get(action, PARAMS)
end
puts "=== HTTP Code ==="
puts res.code
puts "=== Response ==="
puts res.body
設定ファイル
下記プログラムを「config.rb」という名前で保存します。
設定ファイルは、実行ファイル(iijuom_rest.rb)と同じフォルダに保存する必要があります。
下記は、AutomaticApplicationTest(自動申請APIテスト)を実行する場合の設定ファイルです。その他の設定ファイルについて詳しくは、実行するUOM-APIの説明ページに記載のサンプルをご覧ください。
##
## 個別設定
##
# API のキー設定
IIJAPI_ACCESS_KEY = "1234567890ABCDEFGHIJ"
IIJAPI_SECRET_KEY = "1234567890ABCDEFGHIJabcdefghijklmnopqr+1"
##
## API の基本設定
##
# API の ENDPOINT 設定
IIJAPI_ENDPOINT = "https://uom.api.iij.jp"
IIJAPI_SSL_NO_VERIFY = true
# API バージョンの設定
APIVERSION = "20150912"
# Content-Type の設定
CONTENTTYPEVALUE = "application/json; charset=utf-8"
# 自動申請APIテスト
# 以下の内容は、適宜修正してください。
ACTION = "AutomaticApplicationTest"
PARAMS = '{}'