Python virtualenv 中的 Ruby HTTP Post 请求在客户端非常慢

标签 ruby http faraday

我目前遇到了 Faraday HTTP 库的响应时间问题。我正在使用以下代码初始化一个 POST 请求到在我的本地机器上运行的服务器 127.0.0.1。服务器返回一个有效的 JSON 字符串。客户端初始化法拉第对象的代码如下:

url = 'http://127.0.0.1'

conn = Faraday.new(:url => url) do |faraday|
  faraday.request  :url_encoded
  faraday.response :json, :content_type => 'application/json'
  faraday.adapter  Faraday.default_adapter
end

然后我通过 POST 请求向服务器发送一个 JSON 字符串。发送请求的代码如下所示(文本大小最多 5000 个字符):

payload = {:language => 'en', :text => 'some text'}.to_json

response = conn.post do |req|
  req.url '/api'
  req.headers['Content-Type'] = 'application/json'
  req.body = payload
end

预期结果是一个具有以下结构的 JSON 字符串:

{
  "level1.1" : [
     {
       "level2.1" : [
          {
            "value1" : "Text",
            "value2" : "Text",
            "value(...)" : "Text",
            "value(n)" : "Text"
          },
          {...
          }
        ],
<and so on... - of course in a valid JSON structure ending>

当我运行代码而不对结果做任何事情时,它执行得很好并且在合理的时间内完成(< 0.5 秒)。但是一旦我尝试访问响应对象,脚本就会变得非常慢。

只需添加一行:

p response.body

处理时间高达 > 8s。

我已经用 Postman 检查了服务器响应,它工作得很好,没有任何可见的问题。 Postman 的响应时间也 >0.5 秒。当我尝试访问响应对象时,速度变慢仅出现在客户端。仅检查响应对象也不会影响处理时间。但是一旦我开始“做”某事,响应就会变得非常慢。

我正在运行 Ruby 2.5.3 和法拉第 0.15.4/中间件 0.12.2

非常感谢任何可能导致这种放缓的想法。

克里德

编辑

尽管我评论说 HTTParty 解决了这个问题,但这只是由于负载较小。 HTTParty 和 Faraday 在我的 POST 请求上都表现不佳,而来自 Postman 的 POST 请求即使在负载很大的情况下也运行得非常快。当使用完全相同的负载查询完全相同的服务器应用程序时,我不知道是什么导致了这种不同的运行时行为。

如前所述,非常感谢任何可能为我指明正确方向的想法。

克里德

最佳答案

...在寻找解决方案几天后,我终于找到了问题所在。当您将 Python 和 Ruby 代码组合在一个与 virtualenv Python(当然还有激活的 Python env)连接的文件夹中时,Ruby 显然在解析本地地址空间时遇到了问题。它可以工作,但需要绕一些奇怪的弯路,这使得整个过程非常缓慢。

我的解决方案:我将必须通过 HTTP 连接与 Python 代码一起运行的 Ruby 代码移到 Python 代码文件夹之外的文件夹中。

关于Python virtualenv 中的 Ruby HTTP Post 请求在客户端非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982168/

相关文章:

c++ - 如何在 libcurl 中通过 POST 上传文件?

http - 使下载 .rtf 文件成为可能

unit-testing - 模拟 Faraday::Response 对象的 `body` 和 Nokogiri::XML::NodeSet

java - 在没有源文件的情况下反序列化 protobuf

ruby - 使用 RVM 安装位于本地系统上的 Ruby

ruby-on-rails - Rails 编辑序列化的 JSON 数据

ruby - Docker Ruby SSL_connect 返回=1 errno=0 状态=错误 : wrong signature type

ruby - 当我运行 "gem list"时, bundler (默认 : 1. 16.2)是什么意思?什么是(默认)部分?

php - 为什么 codeigniter 等不允许获取变量

ruby-on-rails - #<Faraday::ConnectionFailed> 连接被拒绝 - 连接 (2)