Ruby, der eine API-Anfrage erstellt, ohne jeden Parameter implizit anzugeben
-
14-11-2019 - |
Frage
Ich versuche, eine Anfrage an einen Webdienst zu stellen (fwix), und in meiner Rails-App habe ich den folgenden Initialisierer erstellt, der funktioniert ...Irgendwie habe ich jedoch zwei Probleme:
Aus irgendeinem Grund müssen die Werte der Parameter vorhanden sein
+
ist wie die Leerzeichen, ist das eine Standard-Sache, die ich mit Ruby erreichen kann?Ist dies außerdem eine Standardmethode zum Erstellen einer URL?Ich dachte, dass es Leerzeichen gibt%20
.Wie kann ich in meinem Code eine der eingesandten Optionen übernehmen und sie einfach verwenden, anstatt jede einzelne wie folgt angeben zu müssen?
query_items << "api_key=#{options[:api_key]}" if options[:api_key]
Das Folgende ist mein Code. Der Problembereich, den ich habe, sind die Zeilen, die mit beginnen query_items
Für jeden Parameter in der letzten Methode wären alle Ideen großartig!
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
Lösung
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
Andere Tipps
Für 1) erwartet Ihr API -Anbieter '+', weil die API in einer cGI -formatierten Zeichenfolge anstelle einer URL -formatierten Zeichenfolge erwartet.
require 'cgi'
my_query = "hel lo"
CGI.escape(my_query)
das sollte dir geben
"hel+lo"
wie Sie es erwarten
zu Frage 2) Ich würde so etwas tun
query_items = options.keys.collect { |key| "#{key.to_s}=#{options[key]}" }
Ich bin Entwickler bei Fwix und wollte Ihnen bei Ihrem URL-Escape-Problem helfen.Bei mir funktioniert es jedoch, mit %20 zu entkommen:
wget 'http://geoapi.fwix.com/content.xml?api_key=mark&province=ca&city=san%20francisco&query=gavin%20newsom'
Ich hatte gehofft, Sie könnten mir Ihre konkrete Anfrage mitteilen, dass Sie mit %20 nicht entkommen können.