2011-09-17 20 views
85

Me gustaría que un usuario dentro de mi aplicación ruby ​​on rails pueda enviar un ticket a mi sistema externo de administración de tickets, squishlist.com. Tienen una API e instrucciones de la siguiente manera. Necesita autenticarse y obtener un token y luego enviar el ticket con el token. De squishlist.POST JSON a API usando Rails y HTTParty

# 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} 

Para propósitos de prueba, he creado un controlador, la ruta y vista (página) para la prueba. En mi regulador tengo el 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='[email protected]+'&user_key='[email protected]_key+'&api_key='[email protected]_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='[email protected]+'&token='[email protected]+'&method=squish.issue.submit&prj='[email protected] 

     #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 que voy a 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 en el camino. My json es diferente del ejemplo debido a los campos que he definido en squishlist. ¿Alguien puede ayudarme en este tema?

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

Respuesta

200

He resuelto esto añadiendo .to_json y algo de información sobre el rumbo

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

Gracias, hombre. Ese .to_json en el elemento del cuerpo era la parte que me faltaba. – wndxlori

+8

Gracias, hombre. La tecla: headers era la parte * I * que faltaba. ;-) –

+0

Nota 'as_json' no funciona. Tiene que ser 'to_json' – Hengjie

11

La opción :query_string_normalizer también está disponible, lo que cancelaría el normalizador predeterminado HashConversions.to_params(query)

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

¡Impresionante! Esto permite almacenar el hash en '' request.options [: body] '' pero envía la cadena correcta. Esta debería ser la respuesta real a la pregunta. – freemanoid

+0

La opción también se puede establecer como valor predeterminado en la clase, incluida HTTParty con el método de clase query_string_normalizer, ver: http://www.ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/ClassMethods .html # method-i-query_string_normalizer – Fryie

+0

También puede ser necesario configurar el encabezado de tipo de contenido: http: //www.ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/ClassMethods.html # method-i-headers – Fryie