0

私は、他のアプリケーションがAPIのようなアプリケーションで一連のアクションをトリガーするリクエストを送信できるようにするAPIのようなアプリを開発しています。大きなパラメータ(埋め込みコード)をURL経由で送信する方法を見つける必要があります。私はシナトラを使用しています。

私の最初の試み:(埋め込みコードは受け入れ可能な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

私の2回目の試み:(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ます。詳細については、Encoding Query String Parametersを参照してください。引用:

一部の文字は URL の一部にすることはできず (スペースなど)、その他の一部の文字は URL で特別な意味を持ちます。文字 = は、名前と値を区切るために使用されます。これらの制約を満たすために、クエリ文字列を変換する必要がある場合があります。これは、URL エンコーディングと呼ばれるスキーマを使用して実行できます。

特に、クエリ文字列のエンコードでは、次の規則が使用されます。

  • 文字(A-Za-z)、数字(0-9)、文字.-、はそのまま~です_
  • +SPACE はまたはとしてエンコードされます。%20
  • 他のすべての文字は%FF16 進表現としてエンコードされ、非 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 に答える