Sergey Makridenkov
Sergey Makridenkov

Reputation: 624

HTTP client post with optional splat argument not compiled

I would like to send HTTP post request by using

HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, *, form : Hash(String, String) | NamedTuple)

I try to do this

url = "https://api.authy.com/protected/json/phones/verification/start"
headers = HTTP::Headers{"X-Authy-API-Key" => api_key}

form = {
  via:          "sms",
  country_code: country_code,
  phone_number: phone_number,
  code_length:  6,
  locale:       "ru",
}.to_h

response = HTTP::Client.post(url, headers: headers, form: form)

Unfortunately, I got compilation error

no argument named 'form'
Matches are:
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, body : BodyType = nil) (trying this one)
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, body : BodyType = nil, &block)
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, *, form : String | IO)
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, *, form : String | IO, &block)
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, *, form : Hash(String, String) | NamedTuple)
 - HTTP::Client#post(path, headers : HTTP::Headers | ::Nil = nil, *, form : Hash(String, String) | NamedTuple, &block)

What is correct way to do it?

Upvotes: 1

Views: 282

Answers (1)

Jyrki
Jyrki

Reputation: 568

This compilation error happens because .to_h returns a Hash(Symbol, Int32 | String) on your named tuple, and that is incompatible with any of the definitions for HTTP::Client.post.

To solve this, I suggest to explicitly define form as a Hash(String, String) and replace the keys and values by their string representation:

form : Hash(String, String) = {
  "via"          => "sms",
  "country_code" => country_code.to_s, # assuming this is not a string
  "phone_number" => phone_number,
  "code_length"  => "6",
  "locale"       => "ru",
}

Upvotes: 1

Related Questions