サンプルプログラム

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 = '{}'