2012-05-17 106 views
2

以下命令(及其變體)在mac中運行正常,在mac上運行的ruby程序中運行正常,直接在windows命令提示符下運行,但是當我嘗試在Windows上的ruby文件中運行它時出現解析錯誤。curl從命令行運行,但不是在ruby腳本中

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

我試着用反引號,%x()和system來執行它。我也嘗試過替換字符串和json的棋子,沒有任何運氣。從我可以確定的故障點位於-d"{\"name\":\"repo_name\"}"部分,但那只是在沒有它的情況下嘗試命令。無論如何,在ruby的windows命令的每個變體中,我都會得到JSON解析錯誤。

+3

可能是一個解析/報價問題與紅寶石使用shell機制在Windows上運行命令。你嘗試過'system'的標記化形式,例如:'system('curl',' - u「user:pwd'','-d ...',...)'?在posix上,它會將指定的arg矢量直接發送到exec'ed程序,而不會讓shell受阻。 – dbenhur

+0

爲什麼要捲曲?在ruby中,您可以使用Net :: HTTP直接執行此操作。 – dbenhur

+0

謝謝,dbenhur - 今天下午我會給這個標記化表單一個鏡頭。至於你的其他問題,我們的系統運行jruby,本地擴展似乎是網絡的一個問題:HTTP,curb和我發現的其他問題。 – inyourcorner

回答

1

看起來這可能是一個解析/引用的問題,由Ruby的shell機制在Windows上運行該命令。您是否嘗試過系統的標記化形式,例如:

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

在POSIX,將發送直接不放的方式外殼獲得指定的exec'ed程序ARG向量;可能相同的語義保持爲Windows。

你不應該需要執行curl來做到這一點,因爲ruby具有stdlib Net :: HTTP。在評論中你提到你在jruby下有這個模塊的問題,但是我們在這裏執行http [s]請求的jruby服務就好了,所以你可以嘗試發佈一個問題來解決你使用jruby和本地http客戶端時遇到的具體問題庫。

2

您是否嘗試過使用rest-client

這是一顆寶石,工作相當不錯。這可能比使用system()%x()更好,它絕對更安全(您可以在system()上注入惡意bash命令,因此需要謹慎使用它)。

使用起來非常簡單。只需安裝該寶石,並要求您使用一個紅寶石文件。

注意:如果使用Rails,只需將它添加到您的Gemfile(無需在每個文件上要求)。

require 'rest_client' 

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

你也可以使用一些params爲--insecure ssl。

相關問題