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

时间:2018-12-30 23:09:11

标签: ruby http faraday

我目前在Faraday HTTP库中遇到响应时间问题。我正在使用以下代码初始化对本地计算机上运行的服务器127.0.0.1的POST请求。服务器返回有效的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.5s)完成。但是,一旦我尝试访问响应对象,脚本就会变得非常缓慢。

只需添加以下行:

p response.body

处理时间长达> 8s。

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

我正在运行Ruby 2.5.3和Faraday 0.15.4 /中间件0.12.2

非常感谢可能导致此速度下降的任何原因。

克里德

编辑

尽管我的评论是HTTParty解决了此问题,但这仅是由于有效负载较小所致。 HTTParty和Faraday在我的POST请求上都表现不佳,而来自Postman的POST请求运行非常快,即使负载很大。我不知道在查询具有完全相同的有效负载的完全相同的服务器应用程序时,导致这种不同的运行时行为的原因。

如前所述,任何可能指向我正确方向的想法都会受到赞赏。

克里德

1 个答案:

答案 0 :(得分:0)

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

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