Ruby中的curl剥离了paramters

时间:2016-06-03 07:42:32

标签: ruby http curl

出于某种原因,每当我尝试在我的ruby控制台中调用bash curl命令时,除了第一个参数外,它总是会删除所有命令。任何人都可以解释为什么只发送第一个参数?

例如,如果我有像

这样的东西
`curl -F file=@../cheddar.txt -X POST http://myapp.com/endpoint?key=cheese&action=eat&when=now&id=#{some_id}&version=#{my_version}`

后端只接受key参数。但是,whenversion参数均为null。在我的后端,我使用Java google appengine,它是一个非常标准的servlet,经过测试并使用常规curl命令。我知道第一个参数是发送的,因为如果我不发送key,那么后端会发生其他事情(同样如果我将其他东西交换到第一个参数,则会被发送)

任何想法可能会发生什么?

1 个答案:

答案 0 :(得分:1)

我认为你的shell正在将&符号作为shell命令读取。您需要转义发送到shell的字符串,以便它知道这些字符是字面意思。看看这个脚本:

#!/usr/bin/env ruby

require 'shellwords'

url = 'http://myapp.com/endpoint?key=cheese&action=eat'

puts "With unescaped string:"
puts `echo #{url}`  # => "http://myapp.com/endpoint?key=cheese"
puts 'Note the absence of the last parameter action=eat'
puts "\nNow, with escaped string:"
escaped_url = Shellwords.shellescape(url)
puts `echo #{escaped_url}` # => "http://myapp.com/endpoint?key=cheese&action=eat"

这是Shellwords.shellescape的作用:

2.3.0 :014 > Shellwords.shellescape('http://myapp.com/endpoint?key=cheese&action=eat')
 => "http://myapp.com/endpoint\\?key\\=cheese\\&action\\=eat"

另一种方法是在适当的位置插入双引号,例如:

command = %q{echo "http://myapp.com/endpoint?key=cheese&action=eat"}
puts `#{command}`

请注意,此行为与curl无关; curl只是处理来自shell的任何东西。因此,您还需要使用其他shell命令执行此操作。