使用Ruby通过URL发布数据

时间:2012-05-01 03:48:45

标签: ruby api post sinatra

我正在开发一个类似api的应用程序,允许其他应用程序发送请求,这些请求会在api类应用程序中触发一系列操作。我需要找到一种通过url发送大型参数(嵌入代码)的方法。我正在使用Sinatra。

我的第一次尝试:(因为嵌入代码不是可接受的url参数,所以不起作用)

get '/grab/:name/:bucket/:embed_code' do
  @video = Video.create(
    :name => params[:name],
    :bucket => params[:bucket],
    :embed_code => params[:embed_code],
    :created_at => Time.now
  )
  redirect "/video/#{@video.id}"
end

我的第二次尝试:(Connection refused - connect(2) (Errno::ECONNREFUSED)错误)

# (get '/video_form') points to (post '/video') and post_form was supposed to trigger it

get '/video_form' do
  erb :new_video
end

post '/video' do
  @video = Video.create(
    :name => params[:name],
    :bucket => params[:bucket],
    :embed_code => params[:embed_code],
    :created_at => Time.now
  )
  redirect "/video/#{@video.id}"
end

Net::HTTP.post_form(URI.parse('http://localhost:4567/video_form'),{'name'=>'example_2', 'bucket' => 'bucket_name', 'embed_code' => '<iframe width="560" height="315" src="http://www.youtube.com/embed/ncL1UlvjiMQ" frameborder="0" allowfullscreen></iframe>'})

1 个答案:

答案 0 :(得分:2)

正确的GET请求可能看起来像http://localhost/getit?embed=%3Ciframe%20width%3D%22560%22%20height%3D%22315%22%20src%3D%22youtube.com/embed/ncL1UlvjiMQ%22%3B%20frameborder%3D%220%22%20allowfullscreen%3E%3C/iframe%3E。有关更多信息,请阅读Encoding Query String Parameters。引用:

  

某些字符不能是URL的一部分(例如,空格),而其他一些字符在URL中具有特殊含义:例如,字符#可用于进一步指定a的子部分(或片段)文献; character =用于将名称与值分开。可能需要转换查询字符串以满足这些约束。这可以使用称为URL编码的模式来完成。

     

特别是,对查询字符串进行编码时使用以下规则:

     
      
  • 信件(A-Za-z),数字(0-9)和字符.-~和{{1保持原样
  •   
  • SPACE编码为_+
  •   
  • 所有其他字符编码为%20十六进制表示,其中任何非ASCII字符首先编码为UTF-8(或其他指定编码)
  •   

您可以通过以下方式自行尝试:

%FF

请注意,您不必自己编码值; Web浏览器在发送表单时执行此操作。或者,您可以通过JavaScript发出此GET请求:

<form method="get" action="/getit">
  <input type="hidden" name="embed" value='<iframe width="560" height="315" src="youtube.com/embed/ncL1UlvjiMQ"; frameborder="0" allowfullscreen></iframe>'>
  <button>GO</button>
</form>

POST请求不会显示在查询字符串上,而是由浏览器编码。使用与上面相同的HTML并更改方法,并观看Sinatra接收它。

要在Sinatra中接收复杂参数,请不要尝试将其作为路径的一部分,将其作为查询字符串上的正确参数接收:

var embed = '<iframe width="560" height="315" src="youtube.com/embed/ncL1UlvjiMQ"; frameborder="0" allowfullscreen></iframe>';
location.href = "http://localhost/getit?embed="+escape(embed);