POST JSON vers l'API à l'aide de Rails et HTTParty

106

J'aimerais qu'un utilisateur de mon application ruby ​​on rails puisse soumettre un ticket à mon système de gestion de tickets externe, squishlist.com. Ils ont une API et des instructions comme suit. Vous devez vous authentifier et obtenir un jeton, puis soumettre le ticket avec le jeton. De squishlist.

# get the token

https://api.squishlist.com/auth/?cfg=testcorp&user_key=privatekey&api_key=TEST-KEY-12345
  => {"token": "authtoken",
      "expires": "2010-06-16 13:31:56"}

# and then the ticket with the token

https://api.squishlist.com/rest/?cfg=testcorp&token=authtoken&method=squish.issue.submit&prj=demo
  POST data: {'issue_type': 1, 'subject': 'Hello, world.', 4: 'Open', 5: 10}

À des fins de test, j'ai créé un contrôleur, une route et une vue (page) pour les tests. Sur ma manette, j'ai les éléments suivants

require 'httparty'
require 'json'

class SubmitticketController < ApplicationController

    def submit_a_ticket

        @cfg = 'xxxsupport'
        @user_key = '4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b'
        @api_key = 'MrUser411'
        @project = 'excelm-manoke'
        @url_new_string = 'https://api.squishlist.com/auth/?cfg='+@cfg+'&user_key='+@user_key+'&api_key='+@api_key
        # https://api.squishlist.com/auth/?cfg=xxxsupport&user_key=4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b&api_key=MrUser411  - this is what is created by @url_new_string
        response =  HTTParty.get(@url_new_string.to_str)  #submit the string to get the token
        @parsed_and_a_hash = JSON.parse(response)
        @token = @parsed_and_a_hash["token"]


        #make a new string with the token

        @urlstring_to_post = 'https://api.squishlist.com/rest/?cfg='+@cfg+'&token='+@token+'&method=squish.issue.submit&prj='+@project

        #submit and get a result

        @result = HTTParty.post(@urlstring_to_post.to_str, :body => {:subject => 'This is the screen name', :issue_type => 'Application Problem', :status => 'Open', :priority => 'Normal', :description => 'This is the description for the problem'})

    end

end

Et puis j'ai une page à laquelle je vais pour voir le résultat des actions des contrôleurs et elle contient le code suivant.

<p><%= @result %></p>

Je sais que cela fonctionne en général grâce aux réponses que j'ai reçues en cours de route. Mon json est différent de l'exemple en raison des champs que j'ai définis dans squishlist. Quelqu'un peut-il m'aider sur ce problème?

Je suppose que le vrai problème est que je ne peux pas vraiment voir à quoi ressemble le json et s'il est même proche de correspondre. Je ne sais vraiment pas grand-chose sur json. Dois-je utiliser quelque chose qui pourrait être facile. Dois-je utiliser ajax pour soumettre ceci. Toute aide est grandement appréciée. J'adore la communauté ici.

Homer Jon
la source

Réponses:

258

J'ai résolu cela en ajoutant .to_jsonet quelques informations de titre

@result = HTTParty.post(@urlstring_to_post.to_str, 
    :body => { :subject => 'This is the screen name', 
               :issue_type => 'Application Problem', 
               :status => 'Open', 
               :priority => 'Normal', 
               :description => 'This is the description for the problem'
             }.to_json,
    :headers => { 'Content-Type' => 'application/json' } )
Homer Jon
la source
9
aussi, certaines API comme "GitLab API" sont sensibles à l'en-tête "Accept". Donc, l'en-tête devrait être :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Remarque: l'en-tête ne doit pas être converti en JSON, il devrait s'agir d'un hachage
Devaroop
J'ai déployé un moteur Rails (emballé sous forme de gemme) qui est vraiment utile pour déboguer les API sur les rails. Il vous suffit de monter le moteur et d'aller à l'url que vous avez spécifié, c'est-à-dire «localhost: 3000 / api_explorer» pour le voir. C'est aussi une manière de documenter une API, en lisant la spécification des webservices à partir d'un fichier. Le gem s'appelle «api_explorer» et le dépôt est github.com/toptierlabs/api_explorer. Tout commentaire ou aide à l'amélioration de l'API est le bienvenu. :)
Tony
6
C'est juste idiot que ce ne soit pas dans la documentation.
Tyler Collier
Merci! Cela a très bien fonctionné! Question, cependant: comment incluriez-vous un tableau JSON?
Ruben Martinez Jr.13
1
Vous voulez pousser les données de collecte comme 90k enregistrements comme dans le format ci-dessus. Puis-je envoyer des données entières en un seul appel API? s'il vous plaît laissez-moi savoir vos commentaires
Raju akula
14

L' :query_string_normalizeroption est également disponible, qui remplacera le normaliseur par défautHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}
Brian McNabb
la source
Impressionnant! Cela permet de stocker le hachage request.options[:body]mais d'envoyer la chaîne correcte. Cela devrait être la vraie réponse à la question.
freemanoid
L'option peut également être définie par défaut dans la classe, y compris HTTParty avec la méthode de classe query_string_normalizer, voir: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
Il peut également être nécessaire de définir l'en-tête de type de contenu: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty
...
1
query_string_normalizerdoit être utilisé pour les chaînes de requête, pas pour les données de publication.
josephrider
Les liens vers ruby-doc.orgsont morts, la documentation est sur httparty doc
yacc