When a client class extends this module, its API configuration is parsed. For each operation in the API configuration, one client method is added.
Clients extending QueryXML all have in common their method of serializing request (input) paramters and parsing response (output) XML.
@private
# File lib/aws/core/client/query_xml.rb, line 29 def self.extended base base.send(:include, ErrorParser) base.send(:define_parsers) end
@return [Hash<Symbol,OptionGrammar>] Returns a hash option
parsers. Hash keys are client method names and hash values are {OptionGrammar} objects.
@private
# File lib/aws/core/client/query_xml.rb, line 38 def option_parsers @option_parsers ||= {} end
@return [Hash<Symbol,XML::Parser>] Returns a hash of xml
parsers. Hash keys are client method names and hash values are {XML::Parser} objects.
@private
# File lib/aws/core/client/query_xml.rb, line 46 def xml_parsers @xml_parsers ||= {} end
# File lib/aws/core/client/query_xml.rb, line 66 def define_client_method method_name, operation_name add_client_request_method(method_name) do configure_request do |request, options| now = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ') request.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' request.http_method = 'POST' request.add_param 'Timestamp', now request.add_param 'Version', self.class::API_VERSION request.add_param 'Action', operation_name parser = self.class.option_parsers[method_name] parser.request_params(options).each do |param| request.add_param(param) end end process_response do |response| parser = self.class.xml_parsers[method_name] response.data = parser.parse(response.http_response.body) end simulate_response do |response| parser = self.class.xml_parsers[method_name] response.data = parser.simulate end end end
Enumerates through the operations specified in the API configuration (yaml configuration file found in lib/api_config/) and defines one request method per operation.
# File lib/aws/core/client/query_xml.rb, line 55 def define_parsers api_config[:operations].each do |op| method_name = op[:method] option_parsers[method_name] = OptionGrammar.customize(op[:inputs]) xml_parsers[method_name] = XML::Parser.new(op[:outputs]) end end