我正在建立一个供个人使用的小型网站来测试我公司制作的API.我的老板想要一个我们可以进入网站的网站,使用GET或POST请求表格,以及发送请求的次数.他希望记录请求,每个请求的时间以及所有请求的平均时间.
有没有办法测量使用Ruby的GET或POST请求的响应时间?
我查看了Net :: HTTP库,但没有看到任何返回时间的内容.
有网站已经这样做了吗?他们需要有一个GUI,所以非技术人员可以使用它.如果没有,我计划使用一个运行脚本的简单表单,将该脚本的输出写入文本文件或电子表格,然后将其发送给用户.
还有其他建议吗?(一个漂亮的AJAX外观可能很好用,但可能需要数据库存储.每次运行10000个请求,这可能会很大.
OpenSSL::SSL::SSLErrorWaitReadable "read would block"意思?我收到错误OpenSSL::SSL::SSLErrorWaitReadable消息read would block.我认为这是因为超时,但我找不到有关该主题的任何文档.
偶尔产生此错误的代码:
data = {hello: "world"}
path = "https://example.com/api"
uri = URI.parse(path)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
request = Net::HTTP::Post.new(uri.request_uri)
request.body = Oj.dump(data)
request["Content-Type"] = "application/json"
begin
response = http.request(request) #this line produces the error.
rescue
return nil
end
Run Code Online (Sandbox Code Playgroud)
我在osx上使用ruby版本2.1.5p273和openssl版本.1.0.1i10.10.3
使用命令找到版本 ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
感谢@bayendor
我是一名新的Go程序员,来自Web应用程序和服务开发领域.道歉这是一个关于dep deprp的问题,但我的谷歌搜索答案还没有找到任何答案.此外,这是边缘服务器故障区域,但由于我对API /编程接口更感兴趣,我在这里问.
我使用net/http软件包的内置Web服务器编写了一个小程序.我正准备部署到生产环境,但我对模型Go Go的Web服务器以及我应该如何部署的过程有点不清楚.
具体来说 - 在我习惯的环境(PHP,Ruby,Python)中,我们在应用程序前面有一个Web服务器(Apache,Nginx等),我们将这些Web服务器配置为使用一定数量的工作进程/线程,并配置每个线程应处理的单个HTTP(S)连接数.
我无法找到有关Go的Web服务器如何处理此信息的信息,或者有关如何扩展/规划Go Web服务器规模的实用信息.
即 - 如果我有一个简单的程序运行,准备处理HTTP请求
func main() {
http.HandleFunc("/", processRequest)
http.ListenAndServe(":8000", nil)
}
Run Code Online (Sandbox Code Playgroud)
HandleFunc一次会尝试处理多少个连接?或者它会在连接打开时开始阻塞,并且只在连接关闭后才提供下一个连接?
或者我应该不担心这一点,并把所有东西都塞进一个常规程序?但是,如果我这样做,我如何防止系统被太多执行线程陷入困境?
我基本上是想要
就像我说的,我很新,所以如果我完全错过了这方面的情节,请告诉我!
我正在尝试通过 SSL 获取资源Net::HTTP.这是相关的代码片段:
req = Net::HTTP::Get.new(ContentURI.path)
https = Net::HTTP.new(ContentURI.host, ContentURI.port)
https.use_ssl = true
https.cert = OpenSSL::X509::Certificate.new(@cert_raw)
https.key = OpenSSL::PKey::RSA.new(@cert_key_raw)
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.ca_file = File.join(TestDataPath, 'cacert.pem')
resp = https.start { |cx| cx.request(req) }
Run Code Online (Sandbox Code Playgroud)
或者使用备用的最后一行:
resp = https.get(ContentURI.path)
Run Code Online (Sandbox Code Playgroud)
我已经验证了各种位(证书,密钥,CA证书等)是正确的.
问题是cx.request(req)抛出一个异常:
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server session ticket A
Run Code Online (Sandbox Code Playgroud)
服务器上的Apache SSL错误日志包含以下内容:
[Tue Jan 24 11:47:26 2012] [debug] ssl_engine_kernel.c(1876): OpenSSL: Loop: SSLv3 read finished A
[Tue Jan 24 11:47:26 2012] [debug] ssl_engine_kernel.c(1905): OpenSSL: …Run Code Online (Sandbox Code Playgroud) 我担心在Web服务器上发布文档(例如XML)的经验不多,所以如果我对HTTP的理解不足,我会道歉.
我在127.0.0.1端口上的ruby应用程序中设置了一个基本的Mongrel Web服务器2000.(服务器).
我在同一台计算机上运行一个单独的Ruby应用程序.(客户端).
我需要客户端将XML文档POST到服务器.
我曾尝试使用Net :: HTTP来做到这一点,但我找不到一个明确的例子,告诉我应该做些什么.我有一个去,但遇到了错误.我已经打破了请求,使其尽可能基本:
http = Net::HTTP.new("127.0.0.1", 2000)
http.post('file', 'query=foo') #xc.rb line 6
Run Code Online (Sandbox Code Playgroud)
但它会导致以下错误
C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `read_nonblock': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET)
from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `rbuf_fill'
from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1293:in `request'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:745:in `start'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1284:in `request'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1307:in `send_entity'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1096:in …Run Code Online (Sandbox Code Playgroud) 我在Mac El Capitan上使用Ruby on Rails 4.2.7并且刚刚安装了Tor浏览器(v 6.0.4).我启动了我的Tor浏览器,通过查看几个网页验证了它的运行,但使用这个gem - https://github.com/dryruby/tor.rb,当我运行我的脚本时,Ruby不相信Tor在跑
require 'tor'
...
puts "avaailble: #{Tor.available?}"
puts "version: #{Tor.version}"
Run Code Online (Sandbox Code Playgroud)
返回
avaailble: false
version:
Run Code Online (Sandbox Code Playgroud)
实际上,当我尝试使用https://github.com/brunogh/tor_requests gem 进行Tor请求时,网页请求立即返回,这让我相信Tor网络没有被使用,因为在Tor浏览器中它花费更长的时间(这是我用来对网页请求的代码)...
uri = URI.parse(url)
Net::HTTP.SOCKSProxy('127.0.0.1', 9150).start(uri.host, uri.port) do |http|
f = http.get(uri.path)
end
Run Code Online (Sandbox Code Playgroud)
如何让我的Ruby/Rails代码连接到我本地运行的Tor网络?
编辑:在回答给出的答案时,这里是我将PATH和DYLD_LIBRARY_PATH变量设置为...
localhost:myproject davea$ echo $PATH
/usr/local/opt/coreutils/libexec/gnubin:/opt/local/bin:/opt/local/sbin:/Users/davea/.rvm/gems/ruby-2.3.0/bin:/Users/davea/.rvm/gems/ruby-2.3.0@global/bin:/Users/davea/.rvm/rubies/ruby-2.3.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mysql/bin/:/opt/gradle-2.7/bin:/opt/apache-maven-3.3.3/bin:/Users/ davea/.rvm/bin:/usr/local/mysql/bin:/Applications/TorBrowser.app/Contents/MacOS/Tor:/Users/davea/.rvm/bin:/usr/local/mysql/bin:/Applications/TorBrowser.app/Contents/MacOS/Tor
localhost:myproject davea$ echo $DYLD_LIBRARY_PATH
/Applications/TorBrowser.app/Contents/MacOS/Tor:/usr/local/mysql/lib:/usr/local/mysql/lib:
Run Code Online (Sandbox Code Playgroud)
这里是我的Rails控制台中的ht输出,尝试列出的命令...
localhost:myproject davea$ rails console
Running via Spring preloader in process 49987
Loading development environment (Rails 4.2.7.1)
2.3.0 :001 >
2.3.0 :002 > Tor::Config::CONFDIR = '/Applications/TorBrowser.app//Contents/MacOS/Tor'
(irb):2: …Run Code Online (Sandbox Code Playgroud) 我需要一个应用程序来阻止HTTP请求,所以我不得不添加几行代码,唯一一个我无法弄清楚的是声明if uri.scheme == 'https'; http.use_ssl = true是否有一种方法我可以在当前语句中设置http/https:
Net::HTTP.new(uri.host, uri.port).start do |http|
# Causes and IOError...
if uri.scheme == 'https'
http.use_ssl = true
end
request = Net::HTTP::Get.new(uri.request_uri)
http.request(request)
end
Run Code Online (Sandbox Code Playgroud)
添加: IOError: use_ssl value changed, but session already started
我有问题需要下载,解压缩,然后逐行处理一个非常大的CSV文件.我认为让您了解文件的大小是有用的:
这是我想要发生的一些事情:
我不知道这是否可能.这就是我的想法:
require 'open-uri'
require 'rubyzip'
require 'csv'
open('http://foo.bar/big_file.zip') do |zipped|
Zip::InputStream.open(zipped) do |unzipped|
sleep 10 until entry = unzipped.get_next_entry && entry.name == 'big_file.csv'
CSV.foreach(unzipped) do |row|
# process the row, maybe write out to STDOUT or some file
end
end
end
Run Code Online (Sandbox Code Playgroud)
这是我所知道的问题:
open-uri读取整个响应并将其保存到Tempfile这个大小的文件中.我可能需要Net::HTTP直接使用,但我不知道该怎么做,仍然得到一个IO.Zip::InputStream我的工作方式是否正常.当它不是全部时,它可以解压缩一些文件吗?CSV.foreach用rubyzip的工作InputStream?它的行为是否足以File解析行?如果它想要读取但缓冲区是空的,它会变得怪异吗?我不知道这是否是正确的做法.也许一些EventMachine解决方案会更好(虽然我以前从未使用过EventMachine,但如果它对这样的东西更好用,我就是为了它).
我正在使用rest-client来POST一个非常慢的Web服务.我设置timeout为600秒,我已经确认它正在传递给Net :: HTTP @read_timeout和@open_timeout.
但是,大约两分钟后,我得到一个低级超时错误,Errno::ETIMEDOUT: Connection timed out - connect(2):
回溯的相关部分是
Operation timed out - connect(2) for [myhost] port [myport]
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `open'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `block in connect'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:88:in `block in timeout'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `call'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `timeout'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:878:in `connect'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:852:in `start'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute'
Run Code Online (Sandbox Code Playgroud)
看起来抛出错误的代码行是
TCPSocket.open(conn_address, conn_port, @local_host, @local_port)
Run Code Online (Sandbox Code Playgroud)
好像底层connect(2)系统调用的超时时间大约是两分钟,而传递给Net :: HTTP的超时参数只能缩短它,而不能延长它.有没有办法修改套接字参数来设置更长的超时?
编辑添加:这似乎只是我们的AWS Linux服务器上的问题 - 在我的MacOS开发机器上,十分钟超时工作.我假设connect()MacOS/BSD上的默认超时时间更长,但我真的不知道.
我使用OpenURI库.
object = open("http://example.com")
Run Code Online (Sandbox Code Playgroud)
如果http://example.com服务器代码响应等于200,我的程序就像我预期的那样.但是,如果http://example.com服务器响应代码等于400(或其他),则脚本将以OpenURI :: HTTPError中止:404 Not Found.
如果我使用'begin-rescue'构造并处理'HTTPError exception',我可以避免这种情况.
这是正确的方法吗?我应该使用Net/Http库而不是OpenURI来处理所有情况吗?