Comment puis-je mettre en œuvre cette requête POST à l'aide de HTTParty?
Je vais avoir de la difficulté à faire une requête POST à une API d'extrémité à l'aide de Ruby HTTParty de la bibliothèque. L'API je suis en interaction avec le Gittip API et leur point de terminaison requiert une authentification. J'ai réussi à faire un authentifié requête GET à l'aide HTTParty.
Vous pouvez le voir dans l'exemple de code:
user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"
# I have included real credentials since the above is merely a test account.
HTTParty.get("https://www.gittip.com/#{user}/tips.json",
{ :basic_auth => { :username => api_key } })
Que la requête fonctionne et renvoie les éléments suivants comme prévu:
[
{
"amount" => "1.00",
"platform" => "gittip",
"username" => "whit537"
},
{
"amount" => "0.25",
"platform" => "gittip",
"username" => "JohnKellyFerguson"
}
]
Cependant, j'ai été incapable de faire un POST de demande d'aide HTTParty. Le Gittip API décrit la préparation d'une requête POST à l'aide de curl comme suit:
curl https://www.gittip.com/foobar/tips.json \
-u API_KEY: \
-X POST \
-d'[{"username":"bazbuz", "platform":"gittip", "amount": "1.00"}]' \
-H"Content-Type: application/json"
J'ai essayé (sans succès) de structurer mon code à l'aide de HTTParty comme suit:
user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"
HTTParty.post("https://www.gittip.com/#{user}/tips.json",
{
:body => [ { "amount" => "0.25", "platform" => "gittip", "username" => "whit537" } ],
:basic_auth => { :username => api_key },
:headers => { 'Content-Type' => 'application/json' }
})
Le premier argument est l'url et le deuxième argument est une des options de hachage. Lorsque j'exécute le code ci-dessus, j'obtiens l'erreur suivante:
NoMethodError: undefined method `bytesize' for [{"amount"=>"0.25", "platform"=>"gittip", "username"=>"whit537"}]:Array
from /Users/John/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http/generic_request.rb:179:in `send_request_with_body'
J'ai essayé plusieurs autres combinaisons de structuration de l'appel d'API, mais ne peut pas comprendre comment le faire fonctionner. Voici un autre exemple, où je n'ai pas l'utilisateur d'un tableau comme une partie du corps et de convertir le contenu to_json
.
user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"
HTTParty.post("https://www.gittip.com/#{user}/tips.json",
{
:body => { "amount" => "0.25", "platform" => "gittip", "username" => "whit537" }.to_json,
:basic_auth => { :username => api_key },
:headers => { 'Content-Type' => 'application/json' }
})
Qui renvoie les éléments suivants (erreur 500):
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>\n Internal server error, program!\n <pre></pre>
</body>
</html>
Je ne suis pas vraiment familier avec curl, donc je ne suis pas sûr si je suis de traduire de façon incorrecte choses à HTTParty.
Toute aide serait appréciée. Merci.
OriginalL'auteur John Kelly Ferguson | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Juste une supposition, mais il semble que vous êtes en passant une valeur de hachage dans le corps lorsque JSON est prévu.
Essayez de remplacer le
:body
déclaration:Edit:
J'ai proposé l'
to_json
sérialiseur, mais égaré par de le mettre après le hachage à la place du tableau et le retrait de la matrice de tout. L'exemple utilise plusieurs registres, de sorte que le tableau est nécessaire.Après avoir regardé ce fil, il ressemble à Gittip est pointilleux sur l'en-tête accept.
Donc, la pleine suggestion est:
Mise à jour de la réponse, vous pouvez supprimer le tableau de la déclaration de trop.
bytesize
est une méthode de chaîne afin de l'exécuter sur une table de hachage ou d'un tableau ne fonctionnera pas. Vous pouvez voir le rubis source ici.J'ai essayé ta suggestion sans le tableau et j'ai obtenu une erreur 500. J'ai édité mon post pour décrire ce qui s'est passé en détail.
Mise à jour de ma réponse, basée sur un autre fil (relié).
Je ne suis pas sûr à 100%. Je me suis inspiré de cet exemple sur les réponses en question ce qui semble indiquer que les en-têtes ont été nécessaires.
OriginalL'auteur d_ethier