2016-06-03 2 views
0

По какой-то причине, когда я пытаюсь вызвать команду bash curl в моей рубиновой консоли, она всегда выдает все, кроме первого параметра. может кто-нибудь объяснить, почему отправлен только первый параметр?curl in Ruby stripping out parameters

, например, если у меня есть что-то вроде

`curl -F [email protected]/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, и это очень стандартный сервлет, который был протестирован и работает с обычной командой curl. Я знаю, что первый параметр отправлен, потому что если я не отправлю key, то на бэкэнд будет происходить что-то еще (и, если я поменю что-то еще на первый параметр, который отправляется)

Любые идеи о том, что может произойти ?

+1

Попробуйте включить URL в двойные кавычки. См. Например http://stackoverflow.com/questions/20955748/wget-to-download-image-link-get-truncated/20955807 –

ответ

1

Я думаю, что ваша оболочка читает амперсанды в качестве команд оболочки. Вам нужно избегать строк, которые вы отправляете в свою оболочку, чтобы они знали, что эти символы должны восприниматься буквально. Проверьте этот скрипт:

#!/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 просто обрабатывает все, что получает от оболочки. Таким образом, вам нужно будет сделать это и с другими командами оболочки.

+0

wow. вы просто спасли меня, как 2 часа. Спасибо! –