我正在尝试向网络服务发出请求(弗维克斯),并在我的 Rails 应用程序中创建了以下初始化程序,它可以工作......排序,但是我有两个问题:

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

  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('&')
      query_url
    end
  end
end
有帮助吗?

解决方案

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

其他提示

对于1)您的API提供商期望的“+”,因为API在CGI格式的字符串中所期望的API而不是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]}" }

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

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

我希望你能向我提供你提出的具体请求,即你无法用 %20 逃脱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top