Search code examples
ruby-on-railsruby-on-rails-4

Parse Json Request from CURL in Rails


I need to parse Json data from curl request.Need to split Mac,Parameter,datatype,value from below curl request and pass those data's as input for set method(For each Mac separately).Can anyone please guide how to split?

curl  -k -s -H  "Content-Type: application/json"   -d  '{"Data": {"Mac":"10.43.33.34","Parameter":"Device.wifi","datatype":"string","value":"5Ghz"},{"Mac":"15.23.43.48","Parameter":"Device.wifi","datatype":"string","value":"2.4GHZ"}}'  http://test:3000/api/executions_api_set/

Set API

  def show
       
        client = SetClient.new
        versionResponse = client.set_req(mac,parameter,datatype,value)
        if versionResponse.code == "200"
          value = JSON.parse(versionResponse.body)
          render json: {Mac: mac,Response:value}, status: :ok
        else
          render json: {Mac: mac,Parameter: parameter,status: 'Failed',responsecode:versionResponse.code}, status: :ok

        end

     end
    end
  end


end

Updated Code

def create
        value = ''
        client = SetClient.new
        params["Data"].each do |mac_attributes|
          @mac_address, @Parameter, @dataType, @value = mac_attributes.values_at("Mac", "Parameter", "datatype", "value")
          @versionResponse = client.set_req_api(@mac_address,@Parameter,@dataType,@value)
          puts "versionResponse.status_code #{@versionResponse.code}"
       
         end
        if @versionResponse.code == "200"
          value = JSON.parse(@versionResponse.body)
          render json: {Mac_address: @mac_address,Response:value}, status: :ok
          else
          render json: {Mac_address: @mac_address,Parameter:@Parameter,status: 'Failed',responsecode:@versionResponse.code}, status: :ok
        end  
     
    end
  end
end    



Solution

  • I'm not entirely sure what you're trying to do, but if you want the controller to call a method for each JSON object in the array, it would look something like:

    def show
      params["Data"].each do |hash_of_mac_attributes|
        mac, parameter, datatype, value = hash_of_mac_attributes.values_at("Mac", "Parameter", "datatype", "value")
        method_you_want_to_call(mac, parameter, datatype, value)
      end
    

    This is assuming that rails is correctly detecting and parsing the JSON body into the params hash for you. If it's not, that's a separate issue that can be addressed.

    UPDATE

    In order to return the result from each call to the external service we need to store each call in an array and render the array in the response. Something like the following:

    def show
      json_array = params["Data"].map do |hash_of_mac_attributes|
        mac, parameter, datatype, value = hash_of_mac_attributes.values_at("Mac", "Parameter", "datatype", "value")
        response = client.set_req_api(mac, parameter, datatype, value)
        build_json_for_mac_lookup(response: response, mac: mac, parameter: parameter)
      end
    
      render json: json_array
    end
    def build_json_for_mac_lookup(arguments:, mac:, parameter:)
      json_body = {Mac_address: mac}
      if response.code == "200"
        json_body.merge(Response: JSON.parse(response.body))
      else
        json_body.merge(Parameter: parameter, status: 'Failed', responsecode: response.code)
      end
    end