0

次の Sinatra コードがあります。

post '/bucket' do
  # determine if this call is coming from filling out web form
  is_html = request.content_type.to_s.downcase.eql?('application/x-www-form-urlencoded')

  # If this is a curl call, then get the params differently
  unless is_html
      params = JSON.parse(request.env["rack.input"].read)
  end

  p params[:name]
end

Curl を使用してこれを呼び出すと、params値がありますが、これが Web フォーム経由で呼び出されると、paramsnilparams[:name]ありません。なぜそれが起こるのかを理解するのに数時間を費やし、他の人に助けを求めましたが、何が起こっているのかを本当に知ることはできませんでした.

注意すべきことの 1 つは、次の行をコメントアウトした場合です。

params = JSON.parse(request.env["rack.input"].read)

次にparams、「Web フォーム」投稿の正しい値を持ちます。

実際には、paramsこのコードが CURL 呼び出しによって呼び出されている場合に値を取得することが目標なので、次を使用しました。

params = JSON.parse(request.env["rack.input"].read)

しかし、それはウェブフォームの投稿を台無しにしました. この謎を解ける人はいますか?

4

1 に答える 1

2

個人的には、次のような非表示の値をフォームに設定することで、別の方法で行います。

<input type="hidden" name="webform" value="true">

次に、次のように使用します。

if (params['webform'])
  # this is a request from the form
else
  # this is a request from Curl
end

これが表示された場合、リクエストが Web フォームからのものであることがわかります。params['webform']存在しない場合は、Curl から来たものではありません。

これをファイルに保存し、Ruby で実行しました。

require 'sinatra'

get '/bucket' do
  params[:name]
end

http://localhost:4567/bucket?name=fooディスプレイを使用して実行中のスクリプトを呼び出す:

foo

ブラウザで。

ソースを次のように変更すると:

require 'sinatra'

post '/bucket' do
  params[:name]
end

再起動して、単純な HTML ファイルをロードします。

<html>
  <body>
    <form name="form" method="post" action="http://localhost:4567/bucket">
      <input type="hidden" name="webform" value="true"></input>
      <input type="input" name="name"></input>
      <input type="submit"></input>
    </form>
  </body>
</html>

入力foobarして送信すると、次のようになります。

foobar

ブラウザウィンドウで。

スクリプトを次のように変更すると:

require 'sinatra'

post '/bucket' do
  if (params[:webform])
    'webform is set'
  else
    'webform is not set'
  end
end

Sinatra を再起動してフォームを再送信すると、次のように表示されます。

webform is set

Curl を使用して呼び出す場合:

curl --data "name=foo" http://127.0.0.1:4567/bucket

これは、Curl の応答としてコマンド ラインに表示されます。

webform is not set

スクリプトを次のように変更すると:

require 'sinatra'

post '/bucket' do
  if (params[:webform])
    'webform is set'
  else
    params[:name]
  end
end

スクリプトを再起動し、Curl コマンドで再度呼び出すと、次のようになります。

foo

コマンドラインで。

于 2012-12-10T23:07:27.817 に答える