开发者

How do I get rails to parse params from CURL as JSON or XML instead of a string?

开发者 https://www.devze.com 2023-03-06 02:21 出处:网络
How do I get rails to parse params as JSON or XML instead of a string?I\'m using rails 3.0.7. Here\'s what I want to happen.

How do I get rails to parse params as JSON or XML instead of a string? I'm using rails 3.0.7.

Here's what I want to happen.

Parameters: {"user"=>{"email"=>"user@blah.com", "password"=>"[FILTERED]"}}

Here's what happens

# controller
def create
  logger.debug params
end

# curl from command line
curl -i -H 'Content-Type:application/xml' -H 'Accept:application/xml' -X POST -d "<user><email>user@blah.com</email><password>password</password></user>" http://localhost:3000/api/v1/sessions.xml

# response
Started POST "/api/v1/sessions" for 127.0.0.1 at 2011-05-14 02:16:23 -0700
Processing by Api::V1::SessionsController#create as XML
Parameters: {"<user><email>user@blah.com</email><password>password</password></user>"}
{"<user>开发者_StackOverflow社区;<email>user@blah.com</email><password>password</password></user>", "action"=>"create", "controller"=>"api/v1/sessions", "format"=>"xml"}

Same thing happens with JSON.


An HTTP POST is typically name/value pairs.

Rails is doing its best try and figure out what you've passed it and turn it into a params hash, but it doesn't really make sense.

You can access the request directly:

def create
  string = request.body.read
  # if string is xml
  object = Hash.from_xml(string)
  # elsif string is JSON
  object = ActiveSupport::JSON.decode(string)
end


Run rake middleware, check that the ActionDispatch::ParamsParser is used. Take a look at actionpack-3.0.7/lib/action_dispatch/middleware/params_parser.rb This is the middleware that's parsing the providing data to params hash. My guess is that the problem is with curl, as it doesn't post the request as you think it should. Maybe it needs a space after a colon (in headers), I don't know. I found this on google: http://snippets.dzone.com/posts/show/181.

0

精彩评论

暂无评论...
验证码 换一张
取 消