PUBLICAR JSON a API usando Rails y HTTParty

106

Me gustaría que un usuario dentro de mi aplicación ruby ​​on rails pueda enviar un ticket a mi sistema externo de gestión de tickets, squishlist.com. Tienen una API e instrucciones de la siguiente manera. Debe autenticarse y obtener un token y luego enviar el ticket con el token. 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}

Con fines de prueba, creé un controlador, una ruta y una vista (página) para probar. En mi controlador tengo lo siguiente

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

Y luego tengo una página a la que voy para ver el resultado de las acciones de los controladores y tiene el siguiente código.

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

Sé que está funcionando en general debido a las respuestas que he recibido a lo largo del camino. Mi json es diferente del ejemplo debido a los campos que he definido en squishlist. ¿Alguien puede ayudarme con este problema?

Supongo que el problema real es que realmente no puedo ver cómo se ve el json y si está cerca de coincidir. Realmente no sé mucho sobre json. ¿Debería usar algo que pueda ser fácil? ¿Debería usar ajax para enviar esto? Cualquier ayuda es muy apreciada. Amo la comunidad aquí.

Homero Jon
fuente

Respuestas:

257

Resolví esto agregando .to_jsoninformación de encabezado

@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' } )
Homero Jon
fuente
9
Además, algunas API como la "API de GitLab" son sensibles al encabezado "Aceptar". Entonces el encabezado debería ser :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Nota: el encabezado no debe convertirse a JSON, se espera que sea un hash
Devaroop
Implementé un motor Rails (empaquetado como una joya) que es realmente útil para depurar API en rieles. Solo tiene que montar el motor e ir a la url que especificó, es decir, “localhost: 3000 / api_explorer” para verlo. También es una forma de documentar una API, leyendo la especificación de servicios web desde un archivo. La gema se llama 'api_explorer' y el repositorio es github.com/toptierlabs/api_explorer Cualquier comentario o ayuda para mejorar la api es bienvenido. :)
Tony
6
Es una tontería que eso no esté en la documentación.
Tyler Collier
¡Gracias! ¡Esto funcionó muy bien! Pregunta, sin embargo: ¿cómo incluirías una matriz JSON?
Ruben Martinez Jr.
1
Quiere enviar datos de recopilación como registros de 90k como en el formato anterior. ¿Puedo enviar datos completos en una sola llamada a la API? por favor déjeme saber sus comentarios
Raju akula
14

La :query_string_normalizeropción también está disponible, que anulará el normalizador predeterminadoHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}
Brian McNabb
fuente
¡Increíble! Esto permite almacenar el hash request.options[:body]pero enviar la cadena correcta. Esta debería ser la verdadera respuesta a la pregunta.
Freemanoid
La opción también se puede configurar como predeterminada en la clase, incluido HTTParty con el método de clase query_string_normalizer, consulte: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
También puede ser necesario establecer el encabezado del tipo de contenido: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
1
query_string_normalizerdebe usarse para cadenas de consulta, no para publicar datos.
josephrider
Los enlaces a ruby-doc.orgestán inactivos
yacc