Ruby, формируя запрос API без неявно с указанием каждого параметра
-
14-11-2019 - |
Вопрос
Я пытаюсь сделать запрос на веб-сервис ( fwix ), а в моих рельсахПриложение Я создал следующий инициализатор, который работает ... SOTTA, у меня есть две проблемы, однако:
-
По какой-то причине Значения параметров должны иметь генеракодицетагкод как пробелы, это стандартная вещь, которую я могу сделать с Ruby?Кроме того, это стандартный способ сформировать URL?Я думал, что пробелы были генеракодицетагкодом.
-
В моем коде, как я могу взять любой из вариантов, отправленных и просто используйте их вместо того, чтобы указывать каждый, как
+
Ниже приведен мой код, область беда у меня есть строки, начинающиеся с
%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.