require 'net/https' require 'uri' require 'cgi' require 'json' class OnetWebService def initialize(username, password) @username = username @password = password @headers = { 'Accept' => 'application/json', 'User-Agent' => 'ruby-OnetWebService/1.00 (bot)' } self.set_version end def set_version(version = nil) @url_root = if version.nil? 'https://services.onetcenter.org/ws/' else "https://services.onetcenter.org/v#{version}/ws/" end end def call(path, query = {}) url = @url_root + path + '?' query.each do |key, value| Array(value).each do |v| url += CGI::escape(key.to_s) + '=' + CGI::escape(v.to_s) + '&' end end url.chop! uri = URI.parse(url) request = Net::HTTP::Get.new(uri.request_uri) @headers.each { |k, v| request[k] = v } request.basic_auth(@username, @password) response = nil begin Net::HTTP.start(uri.host, uri.port, :use_ssl => true, :open_timeout => 10, :read_timeout => 10, :ssl_timeout => 10) do |http| response = http.request(request) end rescue StandardError => e return { 'error' => "Call to #{url} failed with reason: #{e.inspect}" } end result = nil case response when Net::HTTPOK, Net::HTTPUnprocessableEntity result = JSON.parse(response.body) else if !response.code.nil? result = { 'error' => "Call to #{url} failed with error code #{response.code}" } else result = { 'error' => "Call to #{url} failed with unknown reason" } end end result end end