Ruby, formant demande d'API sans implicitement indiquant chaque paramètre
-
14-11-2019 - |
Question
Je suis en train de faire une demande à un service web (fwix), et dans mon application rails, j'ai créé la suite de l'initialiseur, qui fonctionne...sorta, j'ai deux problèmes:
Pour une raison quelconque, les valeurs des paramètres besoin d'avoir
+
de 's que les espaces, est-ce un standard chose que je peux faire avec ruby?De plus est-ce une manière standard de la forme d'une url?Je pensais que les espaces ont été%20
.Dans mon code comment puis-je prendre l'une des options envoyé et à les utiliser au lieu d'avoir à l'état de chacun comme
query_items << "api_key=#{options[:api_key]}" if options[:api_key]
Voici mon code, le problème de la zone, je vais avoir sont les lignes commençant par query_items
pour chaque paramètre dans la dernière méthode, les idées serait génial!
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
La solution
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
Autres conseils
Pour le 1) Vous l'API fournisseur est attend à '+' parce que l'API est attendu dans un CGI chaîne formatée, au lieu de l'URL de chaîne formatée.
require 'cgi'
my_query = "hel lo"
CGI.escape(my_query)
cela devrait vous donner
"hel+lo"
comme vous vous attendez
pour la Question 2) je voudrais faire quelque chose comme
query_items = options.keys.collect { |key| "#{key.to_s}=#{options[key]}" }
Je suis un développeur à Fwix et je voulais vous aider avec votre url échapper question.Toutefois, s'échappant avec %20 fonctionne pour moi:
wget 'http://geoapi.fwix.com/content.xml?api_key=mark&province=ca&city=san%20francisco&query=gavin%20newsom'
J'espérais que vous pourriez me fournir avec la demande spécifique, vous réalisez que vous n'êtes pas en mesure de s'échapper par %20.