2013-03-17 3 views
16

나는, 내 랙 응용 프로그램에 {}을 내 코드의 인쇄 데이터로 POST 요청을 보내도록 curl 명령읽는 방법 POST 데이터

curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292 

를 실행합니다. 그것은 아래의 코드에서 puts req.POST()에서 오는 것입니다.

왜 POST 데이터 대신 {}가 출력됩니까? 그리고 랙 어플리케이션에서 POST 데이터에 올바르게 액세스하려면 어떻게해야합니까?

require 'json' 

class Greeter 
    def call(env) 
    req = Rack::Request.new(env) 
    if req.post? 
     puts req.POST() 
    end 
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]] 
    end 
end 

run Greeter.new 

답변

17

POST 용 문서를 읽는 것으로부터 다른 콘텐츠 형식을 기반으로 파싱 된 데이터를 제공하는 것처럼 보입니다. "application/json"을 처리하려면, 아마도

이 필요합니다. 현재 puts req.POST이 곳을 확인하려면

puts req.body.read 

을 시도합니다.


req.body은 문자열이 아니라 I/O 개체입니다. body 설명서를 참조하고 출처를 확인하십시오. 사실 이것이 mudasobwa의 대답과 동일하다는 것을 알 수 있습니다.

Rack 응용 프로그램의 다른 코드는 Sinatra 또는 Rails의 param 파서와 같은 I/O를 읽는 것을 기대할 수 있습니다. 동일한 데이터를보고 오류가 발생하지 않도록하려면 코드에서 요청 본문을 읽기 전과 후에 모두 req.body.rewind으로 전화하십시오. 그러나 이러한 상황에 처한 경우 프레임 워크에 컨트롤러의 일부 옵션을 통해 JSON을 직접 처리하거나 콘텐츠 유형 핸들러 선언 등을 요청할 수있는 옵션이 있는지 고려해야합니다. 이러한 유형의 핸들을 처리 할 가능성이 가장 높습니다. 요청을 프레임 워크 내에서.

+1

FYI - 미들웨어로부터 I/O 스트림을 읽으면 Rails 애플리케이션이 깨질 수있다. 값을 얻었 으면'req.env [ 'rack.input'] rewind'를 실행하여 스트림을 재설정해야합니다. – lookitsatravis

+0

@lookitsatravis : 감사합니다. 답변에 대한 메모를 추가했습니다. OP는 레일이나 다른 프레임 워크없이 Rack을 직접 사용하기 때문에 해당 경우 적용되지 않습니다. Rails를 사용한다면'application/json' 요청을 읽을 수있는 다른 방법이있을 것입니다. –

+0

@Niel : 동의! 나의 특별한 경우에, 나는 랙 공격 (https://github.com/kickstarter/rack-attack)을 사용하고 있는데, 로그인 스로틀 점검 중 하나는 레일스가 그것을 읽기 전에 요청 본문을 구문 분석해야한다는 것이다. 가장자리 사건, 확실히,하지만이 게시물과 내 의견을 이끌었다. 건배! – lookitsatravis

8

시도 :

env['rack.input'].read 

나는 "How to receive a JSON object with Rack"에 그것을 발견하고, 여전히 나에게 이상한 소리를하지만, 그것은 가능성이 작동합니다.

+2

fyi,'gets'는 첫 번째 줄만 읽습니다. –

+4

첫 번째 줄만 읽을뿐만 아니라, 줄에 seperator (기본적으로'\ n')가 추가됩니다. 이렇게하면 JSON 구문 분석 및 서명 요청과 같은 문제가 해결됩니다. 'env [ ''rack.input ']을하는 것이 훨씬 낫다. read – ianks

3

당신이 시도 할 수 :

req.params 

희망이 당신을 도울 수 있습니다.

관련 문제