2015-11-28 194 views
0

我试图在我的rails感情上的分析应用的卷曲调用如下所示https://algorithmia.com/algorithms/nlp/SentimentAnalysis如何红宝石

text = "I love coding" 
secret = "yv5julwo8l7biwuni62r37t823igd87d97u623568yf" 

result = `curl -X POST -d '"#{text}"' -H 'Content-Type: application/json' -H 'Authorization: Simple #{secret}' https://api.algorithmia.com/v1/algo/nlp/SentimentAnalysis/0.1.2` 
result = JSON.parse(result) 

但反引号内的替代变量反引号命令,它不是替代的价值正确。那么如何在这个curl命令中替换变量呢?

当我执行这个代码I love coding,我得到响应0,同时在其网站上,我得到2(这是正确的),所以这让我相信它不是正确的替代变量值。

+0

在这种情况下,是否需要反拨号?你尝试过使用双引号吗? – djt

+0

dtj,back-tick是直接执行任何系统命令所必需的。 – JVK

+1

back-ticks是执行系统命令的多种方法之一。他们是最简单的,但几乎不是最灵活的。 –

回答

1

当进行系统调用任何东西,但最简单的参数您应该始终使用Shellwords库来确保您的参数已正确转义和/或引用。例如:

require "shellwords" 

text = '"I love coding"' 
secret = "yv5julwo8l7biwuni62r37t823igd87d97u623568yf" 

args = [ "-X", "POST", 
     "-d", text, 
     "-H", "Content-Type: application/json", 
     "-H", "Authorization: Simple #{secret}", 
     "https://api.algorithmia.com/v1/algo/nlp/SentimentAnalysis/0.1.2" ] 

data = `curl #{args.shelljoin}` 
result = JSON.parse(data) 

而且,正如铁皮人以上所指出的,反引号既不做在Ruby中的系统调用的唯一的,也不一定最好的方式。我强烈推荐阅读以下系列文章:https://devver.wordpress.com/2009/06/30/a-dozen-or-so-ways-to-start-sub-processes-in-ruby-part-1/

最后,当系统调用curl时,通常不是通过Ruby提供HTTP请求的最佳方式,例如rest-client,faraday和httparty等gem可用时,在标准库中提到Net :: HTTP。

+0

太棒了,不知道Shellwork。谢谢。 – JVK

1

我认为你的api-key存在错误。你的代码和我的api-key一样工作。

编辑:

代码工作如如本:

enter image description here

编辑2:

require 'json' 

text = 'I love coding' 
secret = 'secret' 

result = `curl -X POST -d '"#{text}"' -H 'Content-Type: application/json' -H 'Authorization: Simple #{secret}' https://api.algorithmia.com/v1/algo/nlp/SentimentAnalysis/0.1.2` 
result = JSON.parse(result) 

puts result 
+0

托马斯,我没有在这里发布我的真正关键LOL。你是否使用密钥进行了这种尝试,然后将其输出与直接在网站上获得的结果进行比较?你会发现不同之处,因为''我喜欢编码''返回0,而在他们的网站上它返回2.所以我假设字符串不会从ruby逃脱 – JVK

+0

你可以在这里发布你的ruby代码吗? ? – JVK