Ruby, formando solicitação de API, sem implicitamente afirmando cada parâmetro
-
14-11-2019 - |
Pergunta
Eu estou tentando fazer um pedido a um serviço web (fwix), e na minha trilhos aplicativo que criei o seguinte inicializador, que trabalha...sorta, eu tenho dois problemas, no entanto:
Por alguma razão, os valores dos parâmetros precisa ter
+
's, como a espaços, esta é uma norma coisa que eu posso fazer com ruby?Além disso, esta é uma maneira padrão para formar uma url?Eu pensei que os espaços foram%20
.No meu código como eu posso tomar qualquer uma das opções enviados e apenas usá-los em vez de ter de estado de cada um, como
query_items << "api_key=#{options[:api_key]}" if options[:api_key]
O seguinte é o meu código, a dificuldade área que eu estou tendo são linhas que começam com query_items
para cada parâmetro no último método, alguma idéia seria incrível!
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
Solução
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
Outras dicas
1) Você API de provedor está esperando '+' porque a API está esperando em um CGI cadeia de caracteres formatada em vez do URL string formatada.
require 'cgi'
my_query = "hel lo"
CGI.escape(my_query)
este deve dar-lhe
"hel+lo"
como você espera
para a Pergunta 2) gostaria de fazer algo como
query_items = options.keys.collect { |key| "#{key.to_s}=#{options[key]}" }
Eu sou um desenvolvedor de Fwix e queria ajudá-lo com seus url de escapar problema.No entanto, escapar com 20% funciona para mim:
o wget 'http://geoapi.fwix.com/content.xml?api_key=mark&province=ca&city=san%20francisco&query=gavin%20newsom'
Eu estava esperando que você poderia me fornecer o pedido específico que você está fazendo o que você não consegue escapar com 20%.