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

StackOverflow https://stackoverflow.com/questions/6025833

  •  14-11-2019
  •  | 
  •  

Вопрос

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

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

  2. В моем коде, как я могу взять любой из вариантов, отправленных и просто используйте их вместо того, чтобы указывать каждый, как +

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

    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

Другие советы

For 1) You API provider is expecting '+' because the API is expecting in a CGI formatted string instead of URL formatted string.

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

this should give you

"hel+lo" 

as you expect

for Question 2) I would do something like

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

I'm a developer at Fwix and wanted to help you with your url escaping issue. However, escaping with %20 works for me:

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

I was hoping you could provide me with the specific request you're making that you're unable to escape with %20.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top