【发布时间】:2018-12-30 23:09:11
【问题描述】:
我目前遇到了 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>
当我运行代码而不对结果执行任何操作时,它的性能非常好,并在合理的时间内完成(
只需添加以下行:
p response.body
处理时间长达> 8s。
我用 Postman 检查了服务器响应,它工作得非常好,没有任何明显的问题。 Postman 的响应时间也大于 0.5 秒。当我尝试访问响应对象时,减速仅出现在客户端。仅检查响应对象也不会影响处理时间。但是一旦我开始对响应“做”某事,它就会变得非常缓慢。
我正在运行 Ruby 2.5.3 和 Faraday 0.15.4 / Middleware 0.12.2
非常感谢任何可能导致这种放缓的想法。
孩子
编辑
尽管我评论说 HTTParty 解决了这个问题,但这仅仅是因为有效负载较小。 HTTParty 和 Faraday 在我的 POST 请求上都表现不佳,而来自 Postman 的 POST 请求运行速度非常快,即使负载很大。当使用完全相同的负载查询完全相同的服务器应用程序时,我不知道是什么导致了这种不同的运行时行为。
如前所述,非常感谢任何可能为我指明正确方向的想法。
孩子
【问题讨论】:
-
如果你使用
puts response.body会发生同样的情况吗? -
什么版本的 Ruby?什么版本的法拉第?实际的 JSON 响应是什么? (最好是能够重现问题的最小有效负载)响应的标头是什么?请记住,问题应包括minimal, complete, verifiable example。
-
感谢您的 cmets。我已经编辑了我的问题。不幸的是,由于数据保护问题,我无法在此处发布真实示例。我对此进行了更多研究,看来这是法拉第问题。当我使用 HTTParty 时,一切正常,没有任何延迟。
-
@Aaditya:是的,puts 也会发生这种情况。每当我尝试对结果对象做某事时,处理时间都会增加。唯一不会减慢运行时间的是当我执行 p response.class 时 - 它直接产生输出而没有任何延迟
-
@Krid 我遇到了一些事情。我认为他们也从未找到解决方案。请查看他们的聊天链接。 stackoverflow.com/questions/48554031/google-api-response-time