Comment changer de base_uri avec httparty
Question
J'essaie de passer un paramètre à un login
méthode et je souhaite changer l’URI de base en fonction de ce paramètre.
Ainsi:
class Managementdb
include HTTParty
def self.login(game_name)
case game_name
when "game1"
self.base_uri = "http://game1"
when "game2"
self.base_uri = "http://game2"
when "game3"
self.base_uri = "http://game3"
end
response = self.get("/login")
if response.success?
@authToken = response["authToken"]
else
# this just raises the net/http response that was raised
raise response.response
end
end
...
L'uri de base n'est pas défini lorsque je l'appelle à partir d'une méthode, comment puis-je faire fonctionner cela ?
La solution
Dans HTTPParty, base_uri
est un méthode de classe qui définit un hachage d’options internes.Pour le modifier dynamiquement depuis votre méthode de classe personnalisée login
vous pouvez simplement l'appeler comme méthode (sans l'attribuer comme s'il s'agissait d'une variable).
Par exemple, en modifiant votre code ci-dessus, cela devrait définir base_uri
comme prévu :
...
case game_name
when "game1"
# call it as a method
self.base_uri "http://game1"
...
J'espère que cela aide.
Autres conseils
Je ne peux pas encore commenter, voici donc une extension de la réponse d’Estanislau Trepat.
Pour définir le base_uri
pour tous vos appels, appelez la méthode de classe correspondante :
self.base_uri "http://api.yourdomain.com"
Si vous souhaitez avoir un moyen d'envoyer seulement quelques appels vers un URI différent et évitez les erreurs d'état (oublier de revenir à l'URI d'origine), vous pouvez utiliser l'assistant suivant :
def self.for_uri(uri)
current_uri = self.base_uri
self.base_uri uri
yield
self.base_uri current_uri
end
Avec l'assistant ci-dessus, vous pouvez effectuer des appels spécifiques vers d'autres URI comme les suivants :
for_uri('https://api.anotheruri.com') do
# your httparty calls to another URI
end
Je ne suis pas certain qu'il ait été implémenté lorsque cette question a été posée pour la première fois, mais si vous souhaitez définir ou remplacer :base_uri
sur une base par requête ou par instance, méthodes de requête HTTParty (:get, :post, etc.) accepter les options pour remplacer les options de classe.
Donc, pour l'exemple d'OP, cela pourrait ressembler à ceci :
class Managementdb
include HTTParty
# If you wanted a default, class-level base_uri, set it here:
base_uri "http://games"
def self.login(game_name)
base_uri =
case game_name
when "game1" then "http://game1"
when "game2" then "http://game2"
when "game3" then "http://game3"
end
# To override base_uri for an individual request, pass
# it as an option:
response = get "/login", base_uri: base_uri
# ...
end
end
L'appel dynamique de la méthode de classe, comme suggéré dans certaines des autres réponses, modifie le base_uri pour tous demandes, ce qui n'est probablement pas ce que vous souhaitez.Ce n'est certainement pas thread-safe.