【问题标题】:Reading JavaScript variable in Ruby through curl request通过 curl 请求在 Ruby 中读取 JavaScript 变量
【发布时间】:2018-03-22 17:15:06
【问题描述】:

我需要从这个 javascript 文件中读取英镑汇率:http://cdn.shopify.com/s/javascripts/currencies.js。我希望能够将 js 变量作为JSON 获取,这样我就可以轻松地使用它的索引访问我需要的变量。我尝试了以下几种方法,最终没有成功。

方式 1

来源:https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html

我的代码:

uri = URI('http://cdn.shopify.com/s/javascripts/currencies.js')

@response = Net::HTTP.get(uri) # => String

结果:我得到一个字符串的结果,从字符串中读取 GBP 汇率很困难,而且可能不是正确的方法。

方式 2

来源:curl request in ruby

我的代码:

url = 'http://cdn.shopify.com/s/javascripts/currencies.js'
mykey = 'demo'
uri = URI(url)

request = Net::HTTP::Get.new(uri.path)
request['Content-Type'] = 'application/xml'
request['Accept'] = 'application/xml'
request['X-OFFERSDB-API-KEY'] = mykey

@response = Net::HTTP.new(uri.host,uri.port) do |http|
  http.request(request)
end

结果:这返回给我 Net::HTTP:0x007f2480874050 看起来像一个内存地址,绝对不是我想要的。

此外,无论哪种情况,我都在我的控制器中包含了 require 'net/http' 和 require 'json'。

我对 Ruby 很陌生,我不知道如何解决这个问题。因此,寻找可以提供帮助的人。

【问题讨论】:

    标签: ruby-on-rails ruby curl


    【解决方案1】:

    这有点奇怪,IMO,但 Rails 可以做到。 Rails 自动附带了一个名为 execjs 的库,它允许您从 ruby​​ 运行 javascript。因此,您有一些想要在该文件中运行的 javascript,但您还想从该 javascript 返回特定的密钥,所以应该这样做:

    # Expanding upon 'Way 1', which got you the javascript as a string
    uri = URI('http://cdn.shopify.com/s/javascripts/currencies.js')
    response = Net::HTTP.get(uri)
    
    gbp_rate = ExecJS.exec "#{response}; return Currency.rates.GBP;"
    p gbp_rate # => 1.40045
    

    我只是想重申一下(来自他们在自述文件中的常见问题解答):

    ExecJS 可以用于沙箱脚本吗?

    不,ExecJS 不应用于任何与安全相关的沙盒。由于运行时是自动检测的,因此每个运行时都有不同的沙盒属性。你不应该在任何你不喜欢 Ruby eval()ing 的输入上使用 ExecJS.eval。

    这个文件看起来很安全,但请记住,你实际上是在执行这个 javascript。

    就我个人而言,我会看看是否有某个 API 可以更轻松地为您提供此值,或者它是否不经常更改(我从未使用过 Shopify,所以不知道更改有多大)只是硬编码它在应用程序中作为配置值并手动更新。对我来说只是感觉更干净。

    【讨论】:

    • 这绝对解决了问题。感谢您的时间和精力。
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 2016-05-14
    • 1970-01-01
    • 2020-06-17
    • 2019-04-03
    • 2012-08-10
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多