2

以下命令(及其变体)在 mac 的终端中运行正常,在 mac 上执行的 ruby​​ 程序中运行正常,直接在 windows 命令提示符下运行正常,但是当我尝试在其中运行时失败并出现解析错误Windows 上的 ruby​​ 文件。

curl -u"user:pwd" -d"{\"name\":\"new_repo_beepo\"}" https://api.github.com/user/repos --insecure

我试过用反引号、%x() 和 system. 我也尝试过替换字符串和 json'ing 片段,但没有任何运气。据我所知,故障点在该-d"{\"name\":\"repo_name\"}"部分中,但这只是在没有它的情况下尝试命令。无论如何,在 ruby​​ 中 Windows 上命令的每个变体中,我都会收到 JSON 解析错误。

4

2 回答 2

2

您是否尝试过使用rest-client

它是一颗宝石,效果很好。它可能比使用system()or更好%x(),而且绝对更安全(您可以在其上注入恶意 bash 命令,system()因此需要谨慎使用)。

使用起来非常简单。只需安装 gem 并要求它成为您的 ruby​​ 文件。

注意:如果使用 Rails,只需将其添加到您的 Gemfile(无需在每个文件中都需要它)。

require 'rest_client'

RestClient.get 'https://api.github.com/user/repos', {params: {id: 50, foo: 'bar'}}

您还可以为--insecuressl 使用一些参数。

于 2012-05-17T20:45:39.600 回答
1

这似乎是 ruby​​ 用于在 Windows 上运行命令的 shell 机制的解析/引用问题。您是否尝试过系统的标记化形式,例如:

system('curl', '-u"user:pwd"', '-d"{"name":"new_repo_beepo"}"', 'https://api.github.com/user/repos', '--insecure')

在 posix 上,它将指定的 arg 向量直接发送到执行程序,而不会让 shell 妨碍;可能相同的语义适用于 Windows。

您不需要执行 curl 来执行此操作,因为 ruby​​ 具有 stdlib Net::HTTP。在评论中你提到你在 jruby 下这个模块有问题,但是我们这里有 jruby 服务,可以很好地执行 http[s] 请求,所以你可以尝试发布一个问题来解决你在使用 jruby 和本机 http 客户端时遇到的具体问题库。

于 2012-05-17T21:22:34.040 回答