簡體   English   中英

Ruby 的法拉第 - 多次包含相同的參數

[英]Ruby's Faraday - include the same param multiple times

我正在使用一個 API,該 API 迫使我多次發送相同的參數名稱以級聯不同的過濾條件。 因此,示例 api GET 調用如下所示:

GET http://api.site.com/search?a=b1&a=b2&a=b3&a=c2

我將 Faraday 用於我的 REST 適配器,它將其 URL 參數作為哈希(因此 - 它具有唯一的鍵)。 這意味着我不能做這樣的事情:

response = Faraday.new({
  url: 'http://api.site.com/search'
  params: { a: 'b1', a: 'b2', a: 'b3', a: 'c2' } # => nay
}).get

我試圖在發送請求之前破解網址:

connection = Faraday.new(url: 'http://api.site.com/search')
url        = connection.url_prefix.to_s
full_url   = "#{ url }?a=b1&a=b2&a=b3&a=c2"
response   = connection.get( full_url )

哪個不起作用 - 當我調試響應時,我看到發送到 API 服務器的實際 url 是:

GET http://api.site.com/search?a[]=b1&a[]=b2&a[]=b3&a[]=c2

我無法更改 API。 有沒有辦法繼續與法拉第合作並以優雅的方式解決這個問題? 謝謝。

一段時間以來,我一直試圖弄清楚如何做到這一點。 我最終挖掘了法拉第代碼,並在測試套件中找到了這個用例。

:params => {:color => ['red', 'blue']}

應該屈服

color=red&color=blue

如果您不想升級到 0.9.x

module Faraday
  module Utils
    def build_nested_query(value, prefix = nil)
      case value
      when Array
        value.map { |v| build_nested_query(v, "#{prefix}") }.join("&")
      when Hash
        value.map { |k, v|
          build_nested_query(v, prefix ? "#{prefix}%5B#{escape(k)}%5D" : escape(k))
        }.join("&")
      when NilClass
        prefix
      else
        raise ArgumentError, "value must be a Hash" if prefix.nil?
        "#{prefix}=#{escape(value)}"
      end
    end
  end
end

我認為你稱呼法拉第的方式是不正確的。 您需要先定義一個連接(不帶參數),然后在該連接上調用 HTTP 方法。

像這樣的東西:

require 'faraday'

client = Faraday::Connection.new :url => "http://api.twitter.com" do |builder|
    builder.response :logger
    # some middleware that helps to process a request/response comes here
end

client.get "search", { a: 1, b:2 }

這應該為您構建此請求:

I, [2013-02-05T15:15:40.665955 #57012]  INFO -- : get http://api.twitter.com/search?a=1&b=2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM