Ruby,形成API请求而不隐式声明每个参数

时间:2011-05-17 03:09:19

标签: ruby-on-rails ruby httparty

我正在尝试向Web服务(fwix)发出请求,并且在我的rails应用程序中,我创建了以下初始化程序,它可以正常工作...但是,我有两个问题:< / p>

  1. 由于某些原因,参数的值需要+作为空格,这是我用ruby可以完成的标准事情吗?另外这是形成网址的标准方法吗?我认为空格是%20

  2. 在我的代码中,如何处理发送的任何选项,只需使用它们,而不必像query_items << "api_key=#{options[:api_key]}" if options[:api_key]

  3. 那样说明每个选项。

    以下是我的代码,我遇到的问题是上一个方法中每个参数以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('&')
          query_url
        end
      end
    end
    

3 个答案:

答案 0 :(得分:2)

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]}" }

答案 1 :(得分:1)

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('&')
end

答案 2 :(得分:0)

我是Fwix的开发人员,希望帮助您解决网址问题。但是,使用%20进行转义对我有用:

wget'http://geoapi.fwix.com/content.xml?api_key=mark&province=ca&city=san%20francisco&query=gavin%20newsom'

我希望你能告诉我你正在制作的具体要求,你无法逃脱%20。