POST JSON all'API utilizzando Rails e HTTParty


106

Vorrei che un utente all'interno della mia app ruby ​​on rails potesse inviare un ticket al mio sistema di gestione dei ticket esterno, squishlist.com. Hanno un'API e le istruzioni come segue. Devi autenticarti e ottenere un token, quindi inviare il ticket con il token. Da 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}

A scopo di test, ho creato un controller, route e view (pagina) per il test. Sul mio controller ho quanto segue

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

E poi ho una pagina in cui vado per vedere il risultato delle azioni dei controller e ha il seguente codice.

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

So che funziona in generale a causa delle risposte che ho ricevuto lungo il percorso. Il mio json è diverso dall'esempio a causa dei campi che ho definito in squishlist. Qualcuno può aiutarmi su questo problema?

Immagino che il vero problema sia che non riesco a vedere come appare il json e se è anche vicino alla corrispondenza. Non so davvero molto di Json. Dovrei usare qualcosa che potrebbe essere facile. Dovrei usare ajax per inviare questo. Qualsiasi aiuto è molto apprezzato. Amo la comunità qui.

Risposte:


257

Ho risolto questo problema aggiungendo .to_jsone alcune informazioni sull'intestazione

@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' } )

9
inoltre, alcune API come "GitLab API" sono sensibili all'intestazione "Accept". Quindi l'intestazione dovrebbe essere :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Nota: l'intestazione non deve essere convertita in JSON, dovrebbe essere un hash
Devaroop

Ho distribuito un motore Rails (confezionato come una gemma) che è davvero utile per eseguire il debug delle API su rails. Devi solo montare il motore e andare all'URL che hai specificato, cioè "localhost: 3000 / api_explorer" per vederlo. È anche un modo per documentare un'API, leggendo le specifiche dei servizi web da un file. La gemma si chiama "api_explorer" e il repository è github.com/toptierlabs/api_explorer Qualsiasi commento o aiuto per migliorare l'API è il benvenuto. :)
Tony

6
È solo sciocco che non sia nella documentazione.
Tyler Collier

Grazie! Funzionava benissimo! Domanda, però: come includeresti un array JSON?
Ruben Martinez Jr.

1
Vuoi spingere i dati di raccolta come 90k record come nel formato sopra. Posso inviare interi dati in una singola chiamata API? per favore fatemi sapere i vostri commenti
Raju akula

14

È :query_string_normalizerdisponibile anche l' opzione, che sovrascriverà il normalizzatore predefinitoHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}

Eccezionale! Ciò consente di memorizzare l'hash request.options[:body]ma di inviare la stringa corretta. Questa dovrebbe essere la vera risposta alla domanda.
freemanoid

L'opzione può anche essere impostata come predefinita nella classe, incluso HTTParty con il metodo di classe query_string_normalizer, vedere: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

Potrebbe anche essere necessario impostare l'intestazione del tipo di contenuto: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

1
query_string_normalizerdovrebbe essere utilizzato per le stringhe di query, non per i dati di post.
josephrider

I collegamenti a ruby-doc.orgsono morti, la documentazione è all'indirizzo http://tartparty doc
yacc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.