サンプルプログラム
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 = '{}'