RUBY - SSL、基本身份验证和POST

8

我在这方面遇到了很大的困难——似乎有一些代码片段散落在那里,我无法拼凑起来。 我只是试图POST键/值对,但是却出现了Connection refused - connect(2) (Errno::ECONNREFUSED)的错误。 帮帮我!

require 'net/http'
require 'net/https'
require 'uri'

@http = Net::HTTP.new('https://my.url.com/path', 443)
@http.use_ssl = true
@http.start() { |http|
    req = Net::HTTP.post_form(
        URI.parse('https:///my.url.com/path'),
        {'key1' => 'value1', 'key2' => 'value2'}
    )
    req.basic_auth 'username', 'password'
    response = http.request(req)
    puts response.body      
}
2个回答

20

HTTP#post_form 方法会直接执行,忽略其他设置。可以尝试使用以下方法代替:

require 'net/http'
require 'uri'

url = URI.parse('https://my.url.com/path')
req = Net::HTTP::Post.new(url.path)
req.basic_auth 'user', 'pass'
req.use_ssl = true
req.form_data({'key1' => 'val1', 'key2' => 'val2'})

resp = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
puts resp

你很可能会在服务器证书上遇到麻烦。请参见我的其他帖子,以获取有关如何获取/配置它们的说明。


是的,我不得不使用你的另一篇文章。 有没有什么方法可以关闭控制台的日志记录? 这个会被输出:#<Net :: HTTPOK:0x00000102be6650>`url = URI.parse(@url)req = Net :: HTTP :: Post.new(url.path)   req.basic_auth @username,@password   req.set_form_data(postParams,';')   sock = Net :: HTTP.new(url.host,443)   sock.use_ssl = true   sock.ssl_version ='SSLv3'   sock.start do |http|       response = http.request(req)       return response   end` - user375566
啊,好的,我明白了 - 那只是 puts resp 的输出 - 试试用 puts resp.body - emboss
你觉得你能帮忙解决这个问题吗?http://stackoverflow.com/questions/6903748/ruby-escaping-parameters-in-set-form-data-post 我在编码方面遇到了一些奇怪的问题。 - user375566
实际上,分号“;”是一个错误(复制粘贴时我的失误)。此外,我认为使用form_data比使用set_form_data更方便,它们都是别名并且功能相同,但是form_data=更容易阅读。 - emboss

7

在寻找解决方案时,我发现了这个问题,需要注意的是emboss的代码不能正常工作。 我让以下代码能够正常工作(在较大的Sinatra应用程序中):

require 'net/http'
require 'net/https'
require 'uri'

set :api_username, 'usr'
set :api_passwor, 'pswd'

def do_auth_check params
    puts params.inspect

    url = URI.parse("https://my_auth_site.com:443/authenticate")
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth options.api_username, options.api_password
    req.set_form_data({'username' => params[:name], 'password' => params[:pass]})

    sock = Net::HTTP.new(url.host, url.port)
    sock.use_ssl = true
    res = sock.start {|http| http.request(req) }

    # you're on your own down here to identify success/failure, but for me 2xx/3xx was ok and 401/404/500/etc would be failure
    return true if res.code.to_i < 400
    return "Error logging in"
end

为什么需要使用套接字? - Thufir
@Thufir 发送请求并获取 HTTP 状态码响应。但如果有其他实现方式,我很乐意知道。 - Factor Mystic
1
@Thufir 这不是一个股票,只是一个命名不当的变量。sockNet::HTTP 的一个实例。 - Jimmy Schementi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接