ruby - Python virtualenv中的Ruby HTTP Post请求在客户端非常慢
问题描述
我目前遇到了法拉第 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.5s)。但是,一旦我尝试访问响应对象,脚本就会变得非常缓慢。
只需添加以下行:
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 请求运行速度非常快,即使负载很大。当使用完全相同的有效负载查询完全相同的服务器应用程序时,我不知道是什么导致了这种不同的运行时行为。
如前所述,任何可能为我指明正确方向的想法都非常感谢。
克里德
解决方案
...在寻找解决方案几天后,我终于找到了问题。当您将 Python 和 Ruby 代码组合在与 virtualenv Python(当然还有激活的 Python env)连接的文件夹中时,Ruby 显然在解析本地地址空间时遇到了问题。它有效,但它需要一些奇怪的弯路,使整个事情变得非常缓慢。
我的解决方案:我将必须通过 HTTP 连接与 Python 代码一起使用的 Ruby 代码移动到 Python 代码文件夹之外的文件夹中。
推荐阅读
- sql-server - 我们可以将 SQL Server 与 Azure 通知中心连接起来吗?
- c# - IConnectionAdapter 的 OnConnectionAsync 方法中未捕获的异常
- python - 如何使用熊猫重新格式化数据框?
- python - 用中位数替换 NaN 值?
- visual-studio - Visual Studio 将未选择的代码灰显。如何改变它?
- arrays - 从 pandas 数据框单元格中解析 NumPy 数组
- laravel - 在我以另一个用户身份登录后,如何在不注销并重新登录 laravel 7 的情况下返回我的帐户
- javascript - 基于另一个内部for循环过滤数组
- sql-server - 为什么“CASE WHEN”条件在 SQL Server 中不能正常工作?
- azure-ad-b2c - Azure B2C 应用程序 - 您是否为每种访问模式创建不同的应用程序?