Andres
Andres

Reputation: 11747

Get a JSON as POST parameter

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!

Upvotes: 7

Views: 25561

Answers (2)

Hong
Hong

Reputation: 1333

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

Upvotes: 17

jdl
jdl

Reputation: 17790

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)

Upvotes: 28

Related Questions