ExactOnlineAPI からトークンにアクセスしようとしていますが、ドキュメントではx-www-form-urlencoded
のみを使用することを推奨しています。 Ruby on Railsにはこの種のエンコーディングがありますか?もしそうなら、どのように使用できますか?.
x-www-form-urlencoded
とencode_www_form
の違いは何ですか
params = {
:code => "#{code}",
:redirect_uri => '/auth/exact/callback',
:grant_type => "authorization_code",
:client_id => "{CLIENT_ID}",
:client_secret => "CLIENT_SECRET"
}
uri = URI('https://start.exactonline.nl/api/oauth2/token')
#
uri.query = URI.encode_www_form(params)
res = Net::HTTP.get_response(uri)
puts "Access Token: "+res.body
リクエスト本文は、フォームのマークアップによって定義されます。フォームタグには
enctype
という属性があり、この属性はブラウザにフォームデータのエンコード方法を指示します。この属性にはいくつかの異なる値があります。デフォルトはapplication/x-www-form-urlencodedで、これはブラウザにすべての値をエンコードするように指示します。
したがって、フォームのパラメータとしてそれらのデータによってフォームを送信するためにデータを送信する場合、ヘッダーは定義enctypeに対してapplication/x-www-form-urlencoded
を送信します。
http.set_form_data(param_hash)
あなたのための
params = {
:code => "#{code}",
:redirect_uri => '/auth/exact/callback',
:grant_type => "authorization_code",
:client_id => "{CLIENT_ID}",
:client_secret => "CLIENT_SECRET"
}
uri = URI('https://start.exactonline.nl/api/oauth2/token')
#
Net::HTTP::Get.new(uri.request_uri).set_form_data(params)
またはフォーム送信のPOSTリクエストにはNet::HTTP::Post
を使用します
encode_www_form
は次のとおりです。
指定された列挙型からURLエンコードされたフォームデータを生成します。
URI.encode_www_form([["name", "Ruby"], ["language", "en"]])
#=> "name=Ruby&language=en"
あなたの場合
uri.query = URI.encode_www_form(params)
#=> "code=aas22&redirect_uri=...."
詳細 ここ
簡単に言えば、POST application/www-url-form-encoded request:
# prepare the data:
params = [ [ "param1", "value1" ], [ "param2", "value2" ], [ "param3", "value3" ] ]
uri = ( "your_url_goes_here" )
# make your request:
response = Net::HTTP.post_form( uri, params )
if( response.is_a?( Net::HTTPSuccess ) )
# your request was successful
puts "The Response -> #{response.body}"
else
# your request failed
puts "Didn't succeed :("
end
Net::HTTP
オブジェクトを使用しているため、post_form
クラスメソッドを使用できない場合は、フォーム値を自分でエンコードし、エンコードされた値をデータ文字列として提供します。
def post_form(path, form_params)
encoded_form = URI.encode_www_form(form_params)
headers = { content_type: "application/x-www-form-urlencoded" }
http_client.request_post(path, encoded_form, headers)
end
def http_client
http_client = Net::HTTP.new(@Host, @port)
http_client.read_timeout = @read_timeout
http_client.use_ssl = true
http_client
end