2012-12-10 3 views
0

나는 다음과 같은시나 코드가 :미스터리

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 

I이 사용 컬를 호출 할 경우, params 값을 가지고 있지만, 이것은 웹 양식을 통해 호출 될 때, 다음 paramsnil하고 params[:name]는 아무 상관이 없다 . 나는 그것이 일어나는 이유를 알아 내고 다른 사람들의 도움을 구하는 데 몇 시간을 보냈지 만 아무도 실제로 무슨 일이 일어나고 있는지 알 수 없었다.

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

다음 params은 "웹 형식"게시물에 대한 올바른 값을 가지고 :이 줄을 주석하는 경우주의해야 할

한 가지입니다.

사실, 목표는이 코드 CURL 호출에 의해 호출되는 경우 params 값을 얻을 수 있습니다, 그래서 사용 :

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

하지만 웹 형태의 게시물을 엉망. 누구든지이 신비를 풀 수 있습니까? 당신이 알고 당신이 그것을 볼 경우

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

:

+0

이것은 Curl 대 웹 페이지 양식의 경우가 아니라 'application/x-www-form-urlencoded'대 'multipart/form-data'의 경우 일 수 있습니다. – L2G

+0

Curl'POST' 요청과 폼을 사용하는 브라우저의 요청에 대한'content_type'은'application/x-www-form-urlencoded'입니다. –

답변

2

개인적으로, 나는 형태로 숨겨진 값을 설정하여, 다른 생각을 할 것, 무엇인가 :

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

다음처럼 사용 요청은 귀하의 웹 양식에서 왔습니다. params['webform']가 존재하지 않는다면 Curl에서 온 것이 아닙니다.

나는 파일이 저장된 루비와 함께 실행 :

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 
브라우저 창에서

I가 스크립트를 변경하는 경우

는 :

require 'sinatra' 

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

하고 양식을시나를 다시 시작하고 다시 제출, 나는 참조 :

webform is set 

내가 사용하여 호출하는 경우 말림 :

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

명령 줄에서 Curl의 응답으로 볼 수 있습니다.

I가 스크립트를 변경하는 경우
webform is not set 

:

require 'sinatra' 

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

를 다시 시작 스크립트, 다시 컬 명령으로 전화, 나는 참조 : 명령 행에서

foo 

.

+0

Tin Man 감사합니다. 질문을 잘못 이해 한 것 같습니다. 전화의 출처를 결정하는 것이 문제가 아닙니다. 두 경우 모두 '매개 변수'를 가져 오는 것입니다. – JVK

+0

전혀 질문을 오해하지 않았습니다. 나는 왜 당신이 당신의 요구의 근원을 결정하기 위해 먼 길을 가고 있는지 오해한다. 'params'를 얻는 데 문제가 없었으므로 폼과 DSL을 설정하는 데 더 많은 코드를 사용해야합니다. –

+0

Tin man, CURL로 같은 파일을 호출하려고했는데 else 부분에서 params [: name] – JVK