2013-10-26 2 views
2

HTTParty으로 배열을 POST해야합니다.HTTParty 배열을 게시하는 방법

내 배열은 [1, 2, 3]하고 API 그것은 중요하지만 here's the docs for the API in question 정말 아니다 형태

"story_hash=1&story_hash=2&story_hash=3" 

에있을 몸을받을 것으로 기대하고있다.

순간에 내가 가진 솔루션입니다 :

params = [1, 2, 3].inject('') { |memo, h| memo += "&story_hash=#{h}" } 
# Strip the first '&' 
params.slice!(0) 

options = { body: params } 
HTTParty.post('/reader/mark_story_hashes_as_read', options) 

는 더 좋은 방법이 있나요 (이상적인 솔루션 난 그냥 알고하지 않는 것이 HTTParty의 기능이 될 것입니다)?


나는 다음과 같은 방법을 시도 :

options = { 
    body: { story_hash: [1, 2, 3] } 
} 
HTTParty.post('/reader/mark_story_hashes_as_read', options) 

을하지만 그 잘못이 같은 몸을 보낼 것 같다

"story_hash[]=1&story_hash[]=2&story_hash[]=3" 
+0

에 대한 HTTParty::HashConversions.to_params 방법을 사용할 수 있습니다. 이는 세 가지 요소가 포함 된 story_hash라는 배열 매개 변수로 재구성됩니다 (예 : 레일스). (양식의 다중 선택 결과가 레일에 게시되는 방식을 살펴보십시오 - 동일한 아이디어). – struthersneil

+0

@struthersneil 예. 죄송합니다. 아마 그 단어를 사용해서는 안됩니다. 나는 단지 "내 목적에 부적합하다"는 의미였습니다. –

+0

저는 알고 있습니다 - 왜 누군가가 자신의 배열이 이상하게 인코딩되어 있는지 궁금해하는 경우에 googler를 전달하는 것에 대한 덧글을 추가했습니다. – struthersneil

답변

2
[1, 2, 3].map{|h| "story_hash=#{h}"}.join("&") 
#=> "story_hash=1&story_hash=2&story_hash=3" 

는 또한 CGI.escape(h.to_s)를 사용하는 것이 좋습니다 대신 h 것 , URL에 대한 값을 인코딩합니다 (HTTParty이 이미 수행하지 않는 한) 당신을 위해). 난 그냥 당신이 그것을 사용하려는 경우 두 번 이상 query_string_normalizer 메소드를 오버라이드 (override)하는 것이 좋을 것이라는 점을 추가하려면, @tihom에 동의

[1, 2, 3].map{|h| "story_hash=#{CGI.escape(h.to_s)}"}.join("&") 
#=> "story_hash=1&story_hash=2&story_hash=3" 
+0

이 답변은 몇 가지 설명을 사용할 수 있습니다. 정확히 어디에서 부름을 받아야합니까? –

1

: 같은 탈출 버전 보인다.

class ServiceWrapper 
    include HTTParty 

    query_string_normalizer proc { |query| 
    query.map do |key, value| 
     value.map {|v| "#{key}=#{v}"} 
    end.join('&') 
    } 
end 
1

당신은 정말, 그냥 당신을 아주 기대하고 있지 무엇이 목적 몸이 잘못되지 않았는지

require "httparty" 
HTTParty::HashConversions.to_params((1..3).map { |x| ["story_hash", x] }) 
# => story_hash=1&story_hash=2&story_hash=3 
+0

이것은 작동하지 않습니다 : NoMethodError : [[ "story_hash", 1], [ "story_hash", 2], [ "story_hash", 3] : Array'에 대한 정의되지 않은 메소드'to_hash '. 나는 이것을 Ruby 2.2를 사용하여 시도했다. – pisaruk

관련 문제