Get a JSON as POST parameter

20,296

Solution 1

The official document says,

If the "Content-Type" header of your request is set to "application/json", Rails will automatically load your parameters into the params hash, which you can access as you would normally.

So for example, if you are sending this JSON content:

{ "company": { "name": "acme", "address": "123 Carrot Street" } }

Your controller will receive params[:company] as { "name" => "acme", "address" => "123 Carrot Street" }.

Also, if you've turned on config.wrap_parameters in your initializer or called wrap_parameters in your controller, you can safely omit the root element in the JSON parameter. In this case, the parameters will be cloned and wrapped with a key chosen based on your controller's name. So the above JSON POST can be written as:

{ "name": "acme", "address": "123 Carrot Street" }

And, assuming that you're sending the data to CompaniesController, it would then be wrapped within the :company key like this:

{ name: "acme", address: "123 Carrot Street", company: { name: "acme", address: "123 Carrot Street" } }

So, if you send/POST { "hello": "world"} to apples/, then params['apple'] will be the object for the Json payload.

class ApplesController < ApplicationController
  def create
    # params['apple'] is the object represents Json payload
  end
end

Solution 2

What you are describing is OK, but it implies that there is a param named json_data. If you instead mean that the entire POST body is nothing but the JSON, then you want to look at request.raw_post. You'd end up with something like this:

information = request.raw_post
data_parsed = JSON.parse(information)
Share:
20,296
Andres
Author by

Andres

Updated on July 26, 2022

Comments

  • Andres
    Andres almost 2 years

    I have a ruby application and I need to receive a JSON from a client. Receiving a JSON is just like receiving a string? I just have to do something like:

    information = params[:json_data]
    data_parsed = JSON.parse(information)
    

    That's all or I have to do something different when getting a JSON? The sender has to send me that like string?

    Thanks!