Rails JSON request is not parsed correctly into post parameters

后端 未结 2 1958
小鲜肉
小鲜肉 2021-01-31 11:16

I\'m trying to debug a problem where Rails isn\'t decoding the JSON POST data.

The server logs show:

2011-12-14T06:44:44+00:00 app[web.2]: Started POST 
         


        
相关标签:
2条回答
  • 2021-01-31 11:46

    You can get past this by setting the Content-Type header to "application/json". You can let the controller know what it expects to return with the Accept header set to "application/json".

    The following command with both headers:

    curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json" --header "Content-Type: application/json"
    

    Generates this in the logs:

    Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:09:48 -0800
      Processing by MyController#create as JSON
      Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}
    Completed 200 OK in 5ms (Views: 2.0ms | ActiveRecord: 0.0ms)
    

    This command with the Accept header:

    curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json"
    

    Generates these logs:

    Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:07:26 -0800
      Processing by MyController#create as JSON
      Parameters: {"{ \"company\": { \"name\": \"acme\", \"address\": \"123 Carrot Street\" } }"=>nil}
    Completed 200 OK in 7ms (Views: 5.0ms | ActiveRecord: 0.0ms)
    

    And finally this command with the Content-Type header:

    curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Content-Type: application/json"
    

    Generates these logs:

    Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:08:11 -0800
      Processing by MyController#create as */*
      Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}
    Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.0ms)
    

    Notice the parsed parameters and processing message change subtly with each header type.

    0 讨论(0)
  • 2021-01-31 11:47
    before_filter :fix_ie_params, only: [:create, :update]
    

    For Thin:

    def fix_ie_params
      if request.format == '*/*'
        # try to JSON decode in case of IE XDR
        begin
    
          params.merge! ActiveSupport::JSON.decode(request.body.string)
    
        rescue Exception=>e
          # todo: log exception
        end
      end
    end
    

    For Unicorn and Phusion Passenger:

    def fix_ie_params
      if request.format == '*/*'
        # try to JSON decode in case of IE XDR
        begin
    
          request.body.rewind
          params.merge! ActiveSupport::JSON.decode(request.body.read)
    
        rescue Exception=>e
          # todo: log exception
        end
      end
    end
    
    0 讨论(0)
提交回复
热议问题