2010-12-05 16 views
14

Tengo el siguiente problema. Un servicio web está enviando una solicitud JSON POST a mi aplicación y quiero analizarla.Cómo analizar json de una solicitud POST entrante en Rails?

pensé que sólo puede acceder a los parametros con

@var = params[:name_of_the_JSON_fields] 

pero no funciona. Veo en mis registros de Heroku, que la solicitud está hecha y que los parámetros están ahí, pero no puedo almacenarlos.

¿Alguien tiene una idea?

Respuesta

21

Cuando publique JSON (o XML), los rieles manejarán todo el análisis sintáctico, pero debe incluir los encabezados correctos.

tengan su aplicación incluye:

Content-type: application/json 

y todo estará bien.

+0

Lo siento, no lo entiendo. puedes ser un poco mas especifico? No quiero publicar JSON. Un servicio web está accediendo a mi aplicación con una solicitud POST y solo quiero obtener los datos de esta solicitud y luego analizarlos. – thomas8877

+0

@ thomas8877 no está siendo analizado porque el servicio web no está usando el tipo de contenido correcto. Si no puede hacer que use "application/json", tendrá que asociar otro tipo de contenido como json para que Rails comprenda que necesita analizarlo. –

+0

gracias chicos! Tengo que aprender más sobre este servicio web, porque en este momento es demasiado complicado. – thomas8877

9

Si está recibiendo JSON en el hash params se puede convertir a sí mismo:

@var = JSON.parse(params[:name_of_the_JSON_fields]) 
4

probablemente demasiado tarde para ayudarte, pero tal vez la gente futuras comprobarán aquí :) Quizás carriles se supone que deben analizar JSON para usted, pero eso nunca funcionó para mí. Leí el cuerpo de la solicitud directamente. Uso el analizador jj 'Yajl' - es muy rápido. Pero regular vieja 'json' trabajará también en este caso (sólo tiene que utilizar JSON.parse)

request.body.rewind 
body = Yajl::Parser.parse request.body.read.html_safe 
+0

Esta no es una solución realmente buena. Porque request.body devuelve un StringIO cuyo juego de caracteres está configurado como Encoding :: BINARY. Entonces, si pasa un carácter no ascii, se generará una excepción de codificación – siegy22

+0

¿No debería la codificación binaria ser capaz de manejar cualquier tipo de carácter? – Kevin

+0

No, usará ASCII-8Bit, y tratará de formatearlo en utf8 ... no sé por qué – siegy22

7

Esta respuesta no puede ser determinada a esta pregunta exacta, pero tuve un problema similar al configurar AWS SNS notificaciones push. No pude analizar ni siquiera ver la solicitud de suscripción inicial. Espero que esto ayude a alguien más con un problema similar.

He descubierto que no es necesario analizar si tiene una configuración simple API con el formato predeterminado establecido en JSON, similar a la de abajo (en config/routes.rb):

namespace :api, defaults: {format: :json} do 
    namespace :v1 do 
     post "/controller_name" => 'controller_name#create' 
     get "/controller_name" => 'controller_name#index' 
    end 
    end 

Lo importante Descubrí que es posible acceder a la solicitud de entrada entrante mediante la variable request. Para convertir esto en formato JSON legible, puede llamar a lo siguiente:

request.body.read() 
Cuestiones relacionadas