tekina
tekina

Reputation: 572

Append a hash to a GET endpoint's query params in Rails

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

Answers (3)

tekina
tekina

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

Gerry
Gerry

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

jvillian
jvillian

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

Related Questions