2010-06-04 5 views
2

레일스에서 ​​RESTful 서비스와 통신하려고합니다. 다른 형식 인 json과 xml로 데이터를 반환 할 수 있습니다. 원하는 데이터 형식을 얻을 수있는 구체적인 방법이 있습니까?레일에서 HTTP 헤더 변경하기

서비스에서는 HTTP 헤더에 ACCEPT를 설정해야한다고 언급합니다. Ruby에서 어떻게하는지 잘 모르겠습니다. 나는이 호출에 대한 헤더 정보를 변경하는 방법에 대한 아무 생각이

response = Net::HTTP.get(URI.parse(<url>)) 

을 얻기 위해

은 현재 내가이 일을하고 있습니다. 어떤 도움을 주셔서 감사합니다. 감사.

+0

또한 URL은 경로와 쿼리로 구성됩니다. '/? ' –

답변

3

I 이 query_hash 해시 전에서 모든 쿼리입니다 이런 식으로

uri = URI(<domain>:<port>/<path>) 
params = { <query_hash> } 
headers = { <header_hash> } 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.path) 
request.set_form_data(params) 
request = Net::HTTP::Get.new(uri.path+ '?' + request.body , headers) 
response = http.request(request) 

작업 가지고있다 : { "q" => "cats" } 유사하게 header_hash 예 : { "ACCEPT" => "text/json" }

+0

+1 정말 좋았습니다, 그것은 더 upvoted되어야합니다. 그것의 간단한 작동 예제를 찾는 것은 어려웠습니다. – Eduardo

0

첫째로 당신은 HTTP 세션 객체를 만들어야합니다 :

http_session = Net::HTTP.new(URI.parse('...').to_s, 80) 

이 그럼 당신은 해시로 HTTP 헤더를 정의 할 수 있습니다를, 2 인자로 방법을 얻을 수 전달할 :

http_session.get('/resources', {'Accept' => 'application/xml+xhtml'}) 
+0

내 URL이 이라고 말하십시오. http : //desktop.domain.com : 28880/random/path? something = other' 첫 번째 단계를 시도하면 오류가 발생합니다. 있어야 할 곳에 없는? –

+0

첫 번째 단계에서는 도메인 만 전달해야합니다. 경로 없음, 쿼리 없음 그래서 당신은 'http : //domain.tld'형태로 그것을 떼어 내야 할 것입니다. – Eimantas

0

매개 변수와 헤더를 이와 같이 설정할 수 있습니다.

uri = URI.parse(<url>) 
uri.query = URI.encode_www_form('param1' => 'value1') 
req = Net::HTTP::Get.new(uri.to_s, {'header1' => 'value1'}) 

res = Net::HTTP.new(uri.host, uri.port).request(req)