出于某种原因,每当我尝试在我的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
参数。但是,when
或version
参数均为null。在我的后端,我使用Java google appengine,它是一个非常标准的servlet,经过测试并使用常规curl命令。我知道第一个参数是发送的,因为如果我不发送key
,那么后端会发生其他事情(同样如果我将其他东西交换到第一个参数,则会被发送)
任何想法可能会发生什么?
答案 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命令执行此操作。