0

我正在开发一个类似 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>'})
4

1 回答 1

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。有关更多信息,请阅读编码查询字符串参数。报价:

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

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

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

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

<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>

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

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

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

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

get "/getit" do
  p params['embed']
end
于 2012-05-01T04:47:25.360 回答