Comment invoquer la méthode HTTP POST sur SSL en ruby?
Voici donc la demande à l'aide de curl:
curl -XPOST -H content-type:application/json -d "{\"credentials\":{\"username\":\"username\",\"key\":\"key\"}}" https://auth.api.rackspacecloud.com/v1.1/auth
J'ai essayé de faire cette même requête à l'aide de ruby, mais je n'arrive pas à le faire fonctionner.
J'ai essayé un couple de bibliothèques aussi, mais je ne peux pas le faire fonctionner.
Voici ce que j'ai à ce jour:
uri = URI.parse("https://auth.api.rackspacecloud.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new("/v1.1/auth")
request.set_form_data({'credentials' => {'username' => 'username', 'key' => 'key'}})
response = http.request(request)
- Je obtenir un 415 unsupported media type d'erreur.
Vous devez vous connecter pour publier un commentaire.
Vous sont proches, mais pas tout à fait là. Essayez quelque chose comme ceci à la place:
Ceci permettra de définir le Type de Contenu d'en-tête ainsi que de publier le JSON dans le corps, plutôt que sous la forme de données que votre code a il. Avec les informations d'identification de l'échantillon, il échoue encore, mais je pense qu'elle devrait travailler avec les données réelles de là.
.to_json
à la fin de larequest.body
ligne pour éviter les erreurs d'encodage. Merci pour la réponse très bien!?grant_type=client_credentials
mais vous devez vous assurer que votreContent-Length
en-tête n'est calculé en utilisant le corps, et ne comprenant pas les paramètres définis dans la chaîne de requête. Si vous rencontrez des problèmes, vous devriez vous poser une nouvelle question à ce sujet avec plus de détails.OpenSSL::SSL::VERIFY_NONE
introduit une sécurité des flux. Vous êtes vulnérable à un man-in-the-middle attack en sautant le certificat SSL de vérification.Il y a une très bonne explication de comment faire un JSON requête POST avec Net::HTTP sur ce lien.
Je vous conseille d'utiliser une bibliothèque comme HTTParty. Il est bien documenté, il vous suffit de créer votre classe comme ceci:
Il ressemble à la principale différence entre le code Ruby vous y avez placés, et la demande curl, c'est que la demande curl est l'Affichage JSON (type de contenu application/json) pour le point de terminaison, alors que
request.set_form_data
va envoyer un formulaire dans le corps de la requête POST (type de contenu application/x-www-form-urlencoded). Vous devez vous assurer que le contenu dans les deux sens est de type application/json.Tous les autres sont trop long ici est un UN LINER:
*
to_json
besoinsrequire 'json'
OU si vous voulez
alors:
Dans le cas où il est difficile de se souvenir de ce que params aller où:
get
/post
/patch
/...
.HTTP.start()
: Crée un nouveau Net::HTTP objet, puis ouvre en outre la connexion TCP et HTTP session.HTTP.new()
: Crée un nouveau Net::HTTP objet sans ouverture d'une connexion TCP ou HTTP session.Un autre exemple: