web-dev-qa-db-ja.com

x-www-form-urlencodedの使用方法rails

ExactOnlineAPI からトークンにアクセスしようとしていますが、ドキュメントではx-www-form-urlencodedのみを使用することを推奨しています。 Ruby on Railsにはこの種のエンコーディングがありますか?もしそうなら、どのように使用できますか?.

x-www-form-urlencodedencode_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
9
Little Phild

リクエスト本文は、フォームのマークアップによって定義されます。フォームタグには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=...."

詳細 ここ

10
Rajarshi Das

簡単に言えば、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
4
Achintya Ashok

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

これは Net::HTTP.post_formが内部で行うことです

1
Edward Anderson