POST JSON an die API mit Rails und HTTParty

106

Ich möchte, dass ein Benutzer in meiner Ruby on Rails-App ein Ticket an mein externes Ticketverwaltungssystem, squishlist.com, senden kann. Sie haben eine API und Anweisungen wie folgt. Sie müssen sich authentifizieren und ein Token erhalten und dann das Ticket mit dem Token senden. Aus der 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}

Zu Testzwecken habe ich einen Controller, eine Route und eine Ansicht (Seite) zum Testen erstellt. Auf meinem Controller habe ich Folgendes

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

Und dann habe ich eine Seite, auf der ich das Ergebnis der Controller-Aktionen sehen kann, und sie enthält den folgenden Code.

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

Ich weiß, dass es im Allgemeinen aufgrund der Antworten funktioniert, die ich auf dem Weg erhalten habe. Mein json unterscheidet sich vom Beispiel aufgrund von Feldern, die ich in der Squishlist definiert habe. Kann mir jemand in dieser Angelegenheit helfen?

Ich denke, das eigentliche Problem ist, dass ich nicht wirklich sehen kann, wie der JSON aussieht und ob er auch nur annähernd übereinstimmt. Ich weiß wirklich nicht viel über Json. Sollte ich etwas verwenden, das einfach sein könnte? Sollte ich Ajax verwenden, um dies einzureichen? Jede Hilfe wird sehr geschätzt. Ich liebe die Community hier.

Homer Jon
quelle

Antworten:

257

Ich habe dies durch Hinzufügen .to_jsonund einiger Überschrifteninformationen gelöst

@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
quelle
9
Einige APIs wie die "GitLab-API" reagieren empfindlich auf den Header "Accept". So sollte der Header sein :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Hinweis: Der Header sollte nicht in JSON konvertiert werden, es wird erwartet, dass es sich um einen Hash handelt
Devaroop
Ich habe eine Rails-Engine (als Juwel verpackt) bereitgestellt, die wirklich nützlich ist, um APIs auf Rails zu debuggen. Sie müssen nur die Engine mounten und zu der von Ihnen angegebenen URL gehen, dh "localhost: 3000 / api_explorer", um sie anzuzeigen. Auf diese Weise können Sie auch eine API dokumentieren und die Webservices-Spezifikation aus einer Datei lesen. Das Juwel heißt 'api_explorer' und das Repo ist github.com/toptierlabs/api_explorer. Kommentare oder Hilfe zur Verbesserung der API sind willkommen. :)
Tony
6
Es ist nur albern, dass das nicht in der Dokumentation steht.
Tyler Collier
Vielen Dank! Das hat super geklappt! Frage: Wie würden Sie ein JSON-Array einbinden?
Ruben Martinez Jr.
1
Möchten Sie Sammlungsdaten wie 90.000 Datensätze wie im obigen Format übertragen. Kann ich ganze Daten in einem einzigen API-Aufruf pushen? Bitte lassen Sie mich Ihre Kommentare wissen
Raju Akula
13

Die :query_string_normalizerOption ist ebenfalls verfügbar, wodurch der Standardnormalisierer überschrieben wirdHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}
Brian McNabb
quelle
Genial! Dies ermöglicht es, den Hash zu speichern, request.options[:body]aber die richtige Zeichenfolge zu senden. Dies sollte die eigentliche Antwort auf die Frage sein.
Freeman
Die Option kann auch als Standard in der Klasse einschließlich HTTParty mit der Klassenmethode query_string_normalizer festgelegt werden, siehe: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
Möglicherweise muss auch der Header für den Inhaltstyp festgelegt werden: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
1
query_string_normalizersollte für Abfragezeichenfolgen verwendet werden, nicht für Post-Daten.
Josephphrider
Die Links zu ruby-doc.orgsind tot, die Dokumentation ist bei httparty doc
yacc