Reputation: 572
I'm integrating with a 3rd party service for which the complete URL string of a GET request needs to look something like:
<URL>/some_endpoint?JsonData={"key1" => "value1", "key2" => "value2", "key3" => "value3"}
To be clear, this request has only one param, JsonData
and the entire hash is the corresponding value. All values inside the hash are URL-safe.
JSON/CGI/URI encodings don't seem to help here.
How do I not encode/add escape characters here?
Upvotes: 0
Views: 472
Reputation: 572
This is quite embarassing. Converting the hash to JSON did work eventually.
The final URL looks like:
hash = {"key1" => "value1", "key2" => "value2", "key3" => "value3"}
"#{URL}/some_endpoint?JsonData=#{hash.to_json}"
Upvotes: 0
Reputation: 10517
How about manually creating the string, like this:
hash = {"key1" => "value1", "key2" => "value2", "key3" => "value3"}
url = "/some_endpoint?JsonData={" + hash.map { |k, v| "'#{k}' => '#{v}'" }.join(", ") + "}"
#=> "/some_endpoint?JsonData={'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}"
Upvotes: 0
Reputation: 20253
Perhaps you're looking for the to_query
method?
2.3.1 :024 > {"key1" => "value1", "key2" => "value2", "key3" => "value3"}.to_query
=> "key1=value1&key2=value2&key3=value3"
Or:
2.3.1 :029 > {"JsonData" => {"key1" => "value1", "key2" => "value2", "key3" => "value3"}}.to_query
=> "JsonData%5Bkey1%5D=value1&JsonData%5Bkey2%5D=value2&JsonData%5Bkey3%5D=value3"
Or, as stated in the docs,
An optional namespace can be passed to enclose key names:
2.3.1 :030 > {"key1" => "value1", "key2" => "value2", "key3" => "value3"}.to_query('JsonData')
=> "JsonData%5Bkey1%5D=value1&JsonData%5Bkey2%5D=value2&JsonData%5Bkey3%5D=value3"
So, it could look something like
2.3.1 :031 > "<URL>/some_endpoint?#{{"key1" => "value1", "key2" => "value2", "key3" => "value3"}.to_query('JsonData')}"
=> "<URL>/some_endpoint?JsonData%5Bkey1%5D=value1&JsonData%5Bkey2%5D=value2&JsonData%5Bkey3%5D=value3"
Upvotes: 2