1.7.1
3.0.2
Vu l'avertissement de dépréciation, le code mis à jour pour correspondre aux instructions d'authentification de base documentées . Le code documenté renvoie un certain nombre d'erreurs d'arguments.
Je ne sais pas si les documents sont faux ou s'il s'agit d'un problĂšme avec la gemme.
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'
Les docs sont fausses :) Je viens d'ouvrir un PR pour résoudre ce problÚme.
En attendant, vous devez l'utiliser comme ceci:
http = Faraday.new do |conn|
conn.request(:basic_auth, 'username', 'password')
end
Salut! Le contexte du site Web de documentation ne rimant pas avec le message d'obsolescence 1.x est : "tous les documents du site Web sont le 2.0 Ă venir". Cette version oĂč l'ancienne mĂ©thode est supprimĂ©e.
Le contexte n'est mentionné que dans le README - c'est une faiblesse, pour laquelle nous aimerions obtenir une aide concrÚte sur le front du site Web.
Lien vers cette partie :
@peterberkenbosch est correct, c'est la bonne façon d'utiliser le middleware dans Faraday 1.x, tandis que la documentation montre l'utilisation correcte pour la prochaine v2.0.
Désolé pour la confusion, ce n'est pas la premiÚre fois qu'un problÚme comme celui-ci est soulevé. Je vais chercher une solution rapide pour rendre les choses plus claires
Merci! Tout va bien maintenant. â€ïž
Bonjour @iMacTia ,
J'ai toujours un problĂšme sur ce problĂšme.
J'utilise Faraday 1.7.1 et Ruby 2.7.2.
J'ai initialement créé une connexion comme celle-ci
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
Sur la base de l'exposĂ© ci-dessus, je suppose que si je passe Ă l'utilisation de faraday.request(:token_auth, token), cela devrait aider Ă ajouter un en-tĂȘte dans la demande, donc je suis passĂ© Ă
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
Le client ci-dessus est utilisé de cette maniÚre et j'ai l'erreur "errors"=>["Authentication Required"]
client.get(path, {"sort"=>"created_at", "direction"=>"desc", "per_page"=>100})
J'ai également débogué le code et d'une maniÚre ou d'une autre, le middleware n'a pas pris effet dans la demande et pas de Authorization
dans l'en-tĂȘte, voici un vidage d'objet de demande
#<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)>>
Est-ce que je l'ai mal utilisé ou dois-je créer un nouveau bug ?
BTW, quelle est la différence entre faraday.headers["Authorization"] = "token #{token}"
et faraday.request(:token_auth, token)
. Sur la base de mes connaissances de dĂ©butant en ruby ââet de la lecture du code source, token_auth
essaie de dĂ©finir l'en-tĂȘte, ce qui Ă©quivaut Ă faraday.headers[]=
. Alors dans la doc, pourquoi recommandons-nous d'utiliser un middleware au lieu de dĂ©finir directement l'en-tĂȘte ?
Salut @xiaoxipang , il y a beaucoup de bonnes questions là -dedans, laissez-moi voir si je peux y répondre à toutes.
Est-ce que je l'ai mal utilisé ou dois-je créer un nouveau bug ?
Vous l'avez utilisé correctement, mais je soupçonne que la sortie du middleware n'est pas exactement ce que le serveur attend.
Cette "autorisation de jeton" ressemble Ă une norme assez ancienne qui n'est plus utilisĂ©e et a Ă©tĂ© remplacĂ©e par le jeton Bearer et d'autres mĂ©canismes. La sortie d'en-tĂȘte dans votre exemple serait Authorization: Token token=token
, notez le préfixe token=
, que je soupçonne que votre serveur n'attend pas. Pour résoudre ce problÚme, vous pouvez procéder comme suit :
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
Cela dĂ©finira correctement l'en-tĂȘte sur Authorization: Token token
(pas de préfixe).
S'il vous plaĂźt essayez-le et dites-moi si cela fonctionne!
J'ai Ă©galement dĂ©boguĂ© le code et d'une maniĂšre ou d'une autre, le middleware n'a pas pris effet dans la demande et aucune autorisation dans l'en-tĂȘte, voici un vidage d'objet de demande
C'est étrange, je viens de tester le code ci-dessus et cela fonctionne comme prévu pour moi. En voyant le struct Faraday::Request
dans le dĂ©bogage, je soupçonne que vous regardez l'objet trop tĂŽt, avant que l'en-tĂȘte ne soit dĂ©fini par le middleware.
Si vous exĂ©cutez une requĂȘte et vĂ©rifiez la rĂ©ponse, vous devriez certainement la voir ici :
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"}
...
Ou une autre façon consiste à ajouter le faraday.response :logger
middleware JUSTE AVANT votre adaptateur, de cette façon, il enregistrera la demande une fois que tous les middlewares auront pris effet et vous devriez certainement le voir.
BTW, quelle est la diffĂ©rence entre faraday.headers["Authorization"] = "token #{token}" et faraday.request(:token_auth, token). Sur la base de mes connaissances de dĂ©butant en ruby ââet de la lecture du code source, token_auth essaie de dĂ©finir l'en-tĂȘte, ce qui Ă©quivaut Ă faraday.headers[]=. Alors dans la doc, pourquoi recommandons-nous d'utiliser un middleware au lieu de dĂ©finir directement l'en-tĂȘte ?
La principale raison de cette suggestion est que le middleware offre généralement une plus grande fonctionnalité.
Par exemple, le middleware token_auth
vous permet également de définir les propriétés des jetons et de les formater automatiquement :
faraday.request(:token_auth, 'token', {prop1: value1, prop2: value2})
# This produces `Authorization: Token token=token prop1=value1 prop2=value2
De la mĂȘme maniĂšre, le middleware basic_auth
automatiquement un encodage Base64 de votre paire utilisateur/passe.
Je suis d'accord que le middleware faraday.request(:authorization, 'Token', token)
ci-dessus ne fait pas beaucoup plus que dĂ©finir manuellement l'en-tĂȘte, mais par exemple dans Faraday v2, ce middleware accepte un lambda/proc pour l'argument token
et le résout automatiquement sur chaque demander. Cela vous permet d'avoir une classe TokenStorage
et de changer dynamiquement le jeton entre diffĂ©rentes requĂȘtes. Avec l'autre approche, vous devrez injecter manuellement l'en-tĂȘte sur chaque demande ou recrĂ©er la connexion Ă chaque fois.
J'espĂšre que cela rĂ©pond Ă votre question, mais en bref, vous ĂȘtes bon d'utiliser les deux mĂ©thodes, alors utilisez celle que vous aimez le plus
@iMacTia Merci beaucoup pour l'aide et l'explication détaillée !
S'il vous plaĂźt essayez-le et dites-moi si cela fonctionne!
faraday.request(:authorization, "token", token)
fonctionne pour moi.
Ou une autre façon est d'ajouter le middleware faraday.response :logger JUSTE AVANT votre adaptateur, de cette façon il enregistrera le
demande aprĂšs que tous les middlewares aient pris effet et vous devriez certainement le voir.
C'est super sympa de savoir comment déboguer à partir de maintenant. Et en l'utilisant, vous avez tout à fait raison :
Lorsque vous utilisez faraday.request(:authorization, "token", token)
, l'en-tĂȘte est Authorization: "token token_value"
Lorsque vous utilisez faraday.request(:token_auth, token)
, l'en-tĂȘte est Authorization: "Token token=\"token_value\""
C'est Ă©trange, je viens de tester le code ci-dessus et cela fonctionne comme prĂ©vu pour moi. En voyant la structure Faraday::Request dans le dĂ©bogage, je soupçonne que vous regardez l'objet trop tĂŽt, avant que l'en-tĂȘte ne soit dĂ©fini par le middleware.
Bon, j'ai mis un point d'arrĂȘt dans connection#run_request
et Ă ce moment-lĂ , le middleware n'a pas Ă©tĂ© appelĂ©. J'ajoute un nouveau point d'arrĂȘt dans Faraday::Request::Authorization et maintenant je peux voir comment cela fonctionne.
J'espÚre que cela répond à votre question, mais en bref, vous pouvez utiliser les deux méthodes, alors utilisez celle que vous aimez le plus
Oui et encore merci !
comment se débarrasser de l'avertissement de dépréciation pour le moment?
builder.request :basic_auth, <strong i="6">@client_id</strong>, <strong i="7">@client_secret</strong>
soulÚve toujours l'avertissement pour moi sur 1.7.1 et, comme @mscoutermarsh mentionné, la nouvelle syntaxe n'est pas encore disponible.
@paukul
http = Faraday.new do |conn|
conn.request(:basic_auth, 'username', 'password')
end
C'est corrigé pour nous. Il ressemble au vÎtre, je ne sais pas pourquoi il vous avertit toujours.