2012-01-09 2 views
1

배열로 전달 된 필드 중 하나를 사용하여 URL에 요청을 보내야하는 API를 사용하고 있습니다. 예를 들어 당신이 볼 수 있듯이Ruby HTTP 요청의 URI에서 대괄호 []를 사용하는 방법

"http://www.example.com/objects/add.php?key=XXXXXXXXXXX;objects=[%7B%2522field1%2522%253A%2522My%2520ObjectA2%2522%7D%252C%7B%2522field%2522%253A%2522ObjectB%2522%252C%2522color%2522%253A%25221%2522%252C%2522note%2522%253A%252298765%2522%7D];ids=foo,bar" 

, 배열의내용은 URL 인코딩해야하지만, 전체 URL이 없습니다. 예, 그것이 이상하다는 것을 알고 있지만, API가 설정된 방식입니다. Chrome에 URI를 입력하고 Enter 키를 누르면 작동하지만 Typhoeus (또는 net/http)를 사용하여 전달하기 전에 URI를 인코딩하면 실패합니다 (요청은 통과하지만 API는 올바르게 인식하지 못합니다) .

Ruby가이 URI에 대한 HTTP 요청을 실행하도록하려면 어떻게해야합니까? 없이 대괄호를 URL 인코딩 하시겠습니까?

EDIT :이 SO 응답은 유망스러워 보였지만이 예제에 맞게 monkeypatching을 어떻게 변경해야하는지 잘 모르겠습니다.

How do I monkey-patch ruby's URI.parse method

+0

예, 일부 실제 코드가 도움이됩니다. 또한 웹 서버 로그를 확인하여 요청이 두 인스턴스에서 정확히 번역되었는지 확인하십시오 (Chrome 대 Ruby). – theglauber

+1

@Krule : 무엇이 잘못 되었나요? –

답변

1

는 Typhoeus는 루비 구축하여 HTTP 매개 변수를 전달할 수 있습니다. 귀하의 예를 들어 URL이 JSON 객체를 포함하고 있기 때문에, API는 걸 가능성이 보인다,

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       objects: [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 

그러나 : 귀하의 게시물에서 유사한 URL을 생성하려면의 라인을 따라 뭔가를 할 것 함께 작업하는 것은 POST 요청을 찾고 있습니다.

post_response = Typhoeus::Request.post("http://www.example.com/objects/add.php", params: my_params) 
post_response.effective_url #> http://www.example.com/objects/add.php 
post_response.request.params #> {:api_key=>"XXXXXXXXXXXXXXXXXX", :objects=>[{:field1=>"My ObjectA2"}, {:field=>"ObjectB", :color=>"1", :note=>"98765"}], :ids=>"foo, bar"} 

편집 : API는 GET 요청을 기대하는 경우, GET 요청을 통해 직렬화 된 데이터를 전달하기 위해 현재 가장 일반적인 방법으로

는 매개 변수 이름의 끝에 대괄호를 추가하는 것입니다 :

http://www.example.com/objects/add.php?objects[]=something&objects[]=something%20else 

그러나 Typhoeus는 기본적으로 대괄호를 추가하지 않습니다. 이 결정에 대한 추론을 제공하는 토론이 있습니다 (on the Typhoeus mailing list). 다행히 직접 브래킷을 추가 할 수 있습니다.

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       :"objects[]" => [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects%5B%5D=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects%5B%5D=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 
관련 문제