5

私は、異なるフィルタリング基準をカスケードするために、同じパラメーターの名前を複数回送信することを強制する API に反対しています。したがって、API GET 呼び出しのサンプルは次のようになります。

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

私はRESTアダプターにFaradayを使用しています.FaradayはURLパラメーターをハッシュとして受け取ります(したがって、一意のキーがあります)。これは、次のようなことはできないことを意味します。

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

リクエストが送信される直前にURLをハッキングしようとしました:

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 を変更する方法はありません。ファラデーで作業を続け、これをエレガントな方法で解決する方法はありますか? ありがとう。

4

3 に答える 3

9

私はしばらくの間、これを行う方法を理解しようとしてきました。最終的にファラデーコードを掘り下げて、テストスイートでまさにこのユースケースを見つけました。

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

降伏する必要があります

color=red&color=blue
于 2013-02-20T16:16:56.247 に答える
2

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
于 2013-07-19T19:14:44.340 に答える
0

ファラデーの呼び方は正しくないと思います。最初に (パラメータなしで) 接続を定義する必要があります。次に、その接続で 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
于 2013-02-05T14:18:48.533 に答える