2

私はbashで動作する以下のものを持っています:

curl -d "{ \"auth_token\": \"secret\", \"current\":"${COUNT}"}" http://lab:3030/widgets/connections

しかし、Ruby でこれを試してみると失敗します。

`curl -d "{\"auth_token\":\"secret\",\"current\":"#{count}"}" http://lab:3030/widgets/connections`

そして、次のエラー メッセージが表示されます。

JSON::ParserError - 746: unexpected token at '{auth_token:secret,current:4}':

Ruby からの出力は画面上では正しいように見えますが、JSON パーサー エラーが発生します。他に何を確認できますか?

curb-fu のような gem を使用することを考えていましたが、上記の bash と同じように構築する方法がわかりませんでした。

ありがとう。

4

2 に答える 2

4

を使用してハッシュを変換できますstdlibjson

require 'json'

{foo: "bar"}.to_json
#=> "{\"foo\":\"bar\"}"

shellwordsコマンドをビルドするには:

require 'shellwords'

['curl', '-d', '{"foo":"bar"}', 'http://example.com/'].shelljoin
#=> "curl -d \\{\\\"foo\\\":\\\"bar\\\"\\} http://example.com/"

完全な例:

require 'json'
require 'shellwords'

data = {auth_token: secret, current: count}
`#{['curl', '-d', data.to_json, 'http://lab:3030/widgets/connections'].shelljoin}`
于 2013-07-29T09:36:57.193 に答える
2

エスケープの問題があるようです: Ruby バージョンでは引用符が適切にエスケープされていません。これを試して:

`curl -d "{\\"auth_token\\":\\"secret\\",\\"current\\":"#{count}"}" http://lab:3030/widgets/connections`

これは、Ruby とシェルの両方がバックスラッシュでエスケープするため、エスケープが 2 回発生するためです。追加のバックスラッシュを追加することで、Ruby バージョンは\"just ではなく にエスケープされ"、シェルは引用符をエスケープできます。

于 2013-07-29T08:37:38.460 に答える