10

我正在尝试从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
4

3 回答 3

15

请求正文由表单的标记定义。在表单标签中有一个名为 的属性enctype,该属性告诉浏览器如何对表单数据进行编码。这个属性可以有几个不同的值。默认值为 application/x-www-form-urlencoded,它告诉浏览器对所有值进行编码。

因此,当我们要发送数据以将这些数据作为表单的参数提交表单时,标头将发送application/x-www-form-urlencoded用于定义 enctype

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)

或用于表单提交的发布请求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=...."

更多信息在这里

于 2015-12-10T14:26:46.853 回答
5

简单来说,如果你需要 POST 一个 application/www-url-form-encoded 请求:

# 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
于 2015-12-11T04:18:23.993 回答
2

如果您正在使用一个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

于 2019-03-20T15:08:31.963 回答