Ruby, формирующий запрос API без неявного указания каждого параметра

#ruby-on-rails #ruby #httparty

#ruby-on-rails #ruby #httparty

Вопрос:

Я пытаюсь отправить запрос к веб-сервису (fwix), и в моем приложении rails я создал следующий инициализатор, который работает … вроде, у меня две проблемы, однако:

  1. По какой-то причине значения параметров должны иметь ‘s в качестве пробелов, это стандартная вещь, которую я могу выполнить с ruby? Кроме того, является ли это стандартным способом формирования URL? Я думал, что пробелы были .

  2. В моем коде, как я могу взять любой из отправленных параметров и просто использовать их вместо того, чтобы указывать каждый из них как query_items << "api_key=#{options[:api_key]}" if options[:api_key]

Ниже приведен мой код, проблема, с которой я сталкиваюсь, — это строки, начинающиеся с query_items для каждого параметра в последнем методе, любые идеи были бы потрясающими!

 require 'httparty'
module Fwix
  class API
    include HTTParty

    class JSONParser < HTTParty::Parser
      def json
        JSON.parse(body)
      end
    end

    parser JSONParser
    base_uri "http://geoapi.fwix.com"

    def self.query(options = {})
      begin
        query_url = query_url(options)
        puts "querying: #{base_uri}#{query_url}"
        response = get( query_url )
      rescue
        raise "Connection to Fwix API failed" if response.nil?
      end
    end

    def self.query_url(input_options = {})
      @defaults ||= {
        :api_key => "my_api_key",
      }

      options = @defaults.merge(input_options)
      query_url = "/content.json?"
      query_items = []
      query_items << "api_key=#{options[:api_key]}" if options[:api_key]
      query_items << "province=#{options[:province]}" if options[:province]
      query_items << "city=#{options[:city]}" if options[:city]
      query_items << "address=#{options[:address]}" if options[:address]

      query_url  = query_items.join('amp;')
      query_url
    end
  end
end
  

Ответ №1:

Для 1) Ваш поставщик API ожидает ‘ ‘, потому что API ожидает строку в формате CGI вместо строки в формате URL.

 require 'cgi'
my_query = "hel lo"
CGI.escape(my_query)
  

это должно дать вам

 "hel lo" 
  

как вы ожидаете

для вопроса 2) Я бы сделал что-то вроде

 query_items = options.keys.collect { |key| "#{key.to_s}=#{options[key]}" }
  

Ответ №2:

 def self.query_url(input_options = {})
  options = {
    :api_key => "my_api_key",
  }.merge(input_options)

  query_url = "/content.json?"
  query_items = []

  options.each { |k, v| query_items << "#{k}=#{v.gsub(/s/, ' ')}" }

  query_url  = query_items.join('amp;')
end
  

Ответ №3:

Я разработчик в Fwix и хотел помочь вам с проблемой, связанной с удалением URL. Однако для меня работает экранирование с помощью :

wget ‘http://geoapi.fwix.com/content.xml?api_key=markamp;province=caamp;city=san franciscoamp;query=gavin newsom’

Я надеялся, что вы могли бы предоставить мне конкретный запрос, который вы делаете, который вы не можете выполнить с помощью .