【问题标题】:How to use x-www-form-urlencoded in rails如何在 Rails 中使用 x-www-form-urlencoded
【发布时间】:2015-12-10 14:00:29
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby exact-online


    【解决方案1】:

    请求正文由表单的标记定义。在表单标签中 是一个叫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=...."
    

    更多信息Here

    【讨论】:

    • Raj,我在实现你给我的例子时遇到了问题。您能否根据我发布的示例为我写一个清晰的示例。
    • 是的,你的 api 你需要使用 http.set_form_data({params})
    • Raj,我的意思是像 KingChintz 这样的例子。可以发一下吗?
    【解决方案2】:

    简单来说,如果需要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
    

    【讨论】:

      【解决方案3】:

      如果您使用的是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
      

      这是what Net::HTTP.post_form does internally

      【讨论】:

        猜你喜欢
        • 2019-01-03
        • 1970-01-01
        • 2020-09-12
        • 2011-09-13
        • 2020-08-12
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多