1.7.1
3.0.2
非推奨の警告を確認し、文書化された基本認証手順に一致するようにコードを更新しました。 文書化されたコードは、いくつかの引数エラーをスローします。
ドキュメントが間違っているのか、それともgemの問題なのかわからない。
http = Faraday.new do |conn|
conn.request(:authorization, :basic, 'username', 'password')
end
http.post("https://example.com")
ArgumentError: wrong number of arguments (given 4, expected 3)
from /Users/mscoutermarsh/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/faraday-1.7.1/lib/faraday/request/authorization.rb:43:in `initialize'
ドキュメントが間違っています:)それを修正するためにPRを開いたところです。
それまでの間、次のように使用する必要があります。
http = Faraday.new do |conn|
conn.request(:basic_auth, 'username', 'password')
end
こんにちは! 1.xの非推奨メッセージと韻を踏んでいないドキュメントWebサイトのコンテキストは、「すべてのWebサイトドキュメントは今後の2.0です」です。 古い方法が削除されたバージョン。
コンテキストはREADMEでのみ言及されています。これは弱点であり、Webサイトの前面で具体的な支援を受けたいと考えています。
その部分へのリンク:
@peterberkenboschは正しいです。これは、ファラデー1.xでミドルウェアを使用する正しい方法ですが、ドキュメントには、次のv2.0の正しい使用法が示されています。
混乱して申し訳ありませんが、このような問題が提起されたのはこれが初めてではありません。 私は物事をより明確にするための迅速な解決策を検討します
ありがとうございました! 今はすべて良いです。 ❤️
こんにちは@iMacTia 、
私はまだこの問題に問題があります。
私はファラデー1.7.1とルビー2.7.2を使用しています。
私はもともとこのような接続を作成しました
client = Faraday.new(url: url) do |faraday|
faraday.headers["Accept"] = "application/json"
faraday.headers["X-Version"] = "2"
faraday.headers["Authorization"] = "token #{token}"
faraday.request(:json)
faraday.response(:json, content_type: /\bjson$/)
faraday.adapter(Faraday.default_adapter)
end
上記の話に基づいて、faraday.request(:token_auth、token)を使用するように切り替えると、リクエストにヘッダーを追加するのに役立つはずなので、に切り替えました
client = Faraday.new(url: url) do |faraday|
faraday.headers["Accept"] = "application/json"
faraday.headers["X-Version"] = "2"
faraday.request(:token_auth, token)
faraday.request(:json)
faraday.response(:json, content_type: /\bjson$/)
faraday.adapter(Faraday.default_adapter)
end
上記のクライアントはこのように使用され、エラー"errors"=>["Authentication Required"]
client.get(path, {"sort"=>"created_at", "direction"=>"desc", "per_page"=>100})
また、コードをデバッグしましたが、どういうわけか、ミドルウェアがリクエストで有効にならず、ヘッダーにAuthorization
がありません
#<struct Faraday::Request http_method=:get, path="hide/the/path", params={"sort"=>"created_at", "direction"=>"desc", "per_page"=>100}, headers={"Accept"=>"application/json;", "X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1"}, body=nil, options=#<Faraday::RequestOptions (empty)>>
間違った方法で使用しましたか、それとも新しいバグを作成する必要がありますか?
ところで、 faraday.headers["Authorization"] = "token #{token}"
とfaraday.request(:token_auth, token)
の違いは何ですか。 私の初心者のルビーの知識とソースコードの読み取りに基づいて、 token_auth
はヘッダーを設定しようとしています。これはfaraday.headers[]=
相当します。 次に、ドキュメントで、ヘッダーを直接設定するのではなく、ミドルウェアを使用することをお勧めするのはなぜですか?
こんにちは@xiaoxipang 、
間違った方法で使用しましたか、それとも新しいバグを作成する必要がありますか?
正しく使用しましたが、ミドルウェアの出力がサーバーが期待しているものと正確に一致していないと思われます。
この「トークン認証」は、もう使用されておらず、Bearerトークンやその他のメカニズムに置き換えられたかなり古い標準のように見えます。 あなたの例のヘッダー出力はAuthorization: Token token=token
になりますが、 token=
プレフィックスに注意してください。これは、サーバーが予期していないと思われます。 これを修正するには、代わりに次の手順を実行できます。
client = Faraday.new(url: url) do |faraday|
# This header is not necessary, it will be set by the json middleware
# faraday.headers["Accept"] = "application/json"
faraday.headers["X-Version"] = "2"
faraday.request(:authorization, 'Token', token)
faraday.request(:json)
faraday.response(:json, content_type: /\bjson$/)
faraday.adapter(Faraday.default_adapter)
end
これにより、ヘッダーがAuthorization: Token token
(プレフィックスなし)に正しく設定されます。
試してみて、うまくいくかどうか教えてください!
また、コードをデバッグしましたが、どういうわけか、ミドルウェアがリクエストで有効にならず、ヘッダーに承認がありませんでした。これが1つのリクエストオブジェクトダンプです。
それは奇妙なことです。上記のコードをテストしたところ、期待どおりに機能しました。 デバッグでstruct Faraday::Request
が表示されるのは、ミドルウェアによってヘッダーが設定される前に、オブジェクトを確認するのが早すぎるのではないかと思います。
リクエストを実行してレスポンスを確認すると、必ずそこに表示されます。
client.get('https://google.co.uk')
=> #<Faraday::Response:0x00007fdd01ad1340
@on_complete_callbacks=[],
@env=#<Faraday::Env
@method=:get
@url=#<URI::HTTPS https://google.co.uk/>
@request=#<Faraday::RequestOptions (empty)>
@request_headers={"X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1", "Authorization"=>"Token token"}
...
または、別の方法は、アダプターの直前にfaraday.response :logger
ミドルウェアを追加することです。これにより、すべてのミドルウェアが有効になった後に要求がログに記録され、確実に表示されます。
ところで、faraday.headers ["Authorization"] = "token#{token}"とfaraday.request(:token_auth、token)の違いは何ですか。 私の初心者のルビーの知識とソースコードの読み取りに基づいて、token_authはfaraday.headers [] =と同等のヘッダーを設定しようとしています。 次に、ドキュメントで、ヘッダーを直接設定するのではなく、ミドルウェアを使用することをお勧めするのはなぜですか?
その提案の主な理由は、ミドルウェアは通常、より優れた機能を提供するということです。
たとえば、 token_auth
ミドルウェアを使用すると、トークンプロパティも設定し、それらを自動的にフォーマットできます。
faraday.request(:token_auth, 'token', {prop1: value1, prop2: value2})
# This produces `Authorization: Token token=token prop1=value1 prop2=value2
同様に、 basic_auth
ミドルウェアは、ユーザーとパスのペアのBase64エンコーディングを自動的に実行します。
上記のfaraday.request(:authorization, 'Token', token)
ミドルウェアは、ヘッダーを手動で設定する以上のことはしていないことに同意しますが、たとえばFaraday v2では、ミドルウェアはtoken
引数のラムダ/プロシージャを受け入れ、それぞれで自動的に解決します。リクエスト。 これにより、 TokenStorage
クラスを作成し、異なるリクエスト間でトークンを動的に変更できます。 他のアプローチでは、リクエストごとにヘッダーを手動で挿入するか、毎回接続を再作成する必要があります。
これがあなたの質問に答えることを願っていますが、要するにあなたは両方の方法を使うのが良いので、あなたが最も好きなものを使ってください😄
@iMacTia助けと詳細な説明をありがとうございました!
試してみて、うまくいくかどうか教えてください!
faraday.request(:authorization, "token", token)
は私のために働きます。
または、別の方法は、アダプターの直前にfaraday.response:loggerミドルウェアを追加することです。この方法でログに記録されます。
すべてのミドルウェアが有効になったらリクエストしてください。間違いなく表示されます。
これからデバッグする方法を知ってとてもうれしいです。 そしてそれを使用することにより、あなたは完全に正しいです:
faraday.request(:authorization, "token", token)
使用する場合、ヘッダーはAuthorization: "token token_value"
faraday.request(:token_auth, token)
使用する場合、ヘッダーはAuthorization: "Token token=\"token_value\""
それは奇妙なことです。上記のコードをテストしたところ、期待どおりに機能しました。 デバッグで構造体Faraday :: Requestを確認すると、ミドルウェアによってヘッダーが設定される前に、オブジェクトを確認するのが早すぎる可能性があります。
そうです、 connection#run_request
にブレークポイントを設定しましたが、その時点ではミドルウェアは呼び出されていません。 Faraday :: Request :: Authorizationに新しいブレークポイントを追加すると、それがどのように機能するかを確認できます。
これがあなたの質問に答えることを願っていますが、要するにあなたは両方の方法を使うのが良いので、あなたが最も好きなものを使ってください
はい、ありがとうございます!
しかし、今のところ非推奨の警告を取り除く方法は?
builder.request :basic_auth, <strong i="6">@client_id</strong>, <strong i="7">@client_secret</strong>
それでも1.7.1で警告が表示され、 @ mscoutermarshが述べたように、新しい構文はまだ利用できません。
@paukul
http = Faraday.new do |conn|
conn.request(:basic_auth, 'username', 'password')
end
私たちのためにそれを修正しました。 見た目はあなたと同じですが、なぜそれでも警告が表示されるのかわかりません。