Разбор запроса Json от CURL в Rails

#ruby-on-rails #ruby-on-rails-4

Вопрос:

Мне нужно проанализировать данные Json из запроса curl.Необходимо разделить Mac,параметр,тип данных,значение ниже запроса curl и передать эти данные в качестве входных данных для метода set(для каждого Mac отдельно).Кто-нибудь может, пожалуйста, подсказать, как разделиться?

 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/
 

Установить 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

 

Обновленный Код

 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    


 

Комментарии:

1. Не уверен, что понимаю ваш вопрос. Я полагаю, что ваш запрос CURL неправильно сформировал содержимое JSON, вам нужно обернуть список объектов JSON с mac-адресами в массив. Что-то вроде {"Data": [{"Mac":"..."},{}]} . Затем Rails проанализирует содержимое тела JSON и выдаст вам массив хэшей с ключами и значениями из вашего объекта JSON. например params["Data"] , это массив объектов, params["Data"].map{|mac_object| mac_object["Mac"]} это массив mac-адресов.

Ответ №1:

Я не совсем уверен, что вы пытаетесь сделать, но если вы хотите, чтобы контроллер вызывал метод для каждого объекта JSON в массиве, это будет выглядеть примерно так:

 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
 

Это предполагает, что rails правильно обнаруживает и анализирует тело JSON в хэше параметров для вас. Если это не так, то это отдельная проблема, которую можно решить.

Обновить

Чтобы возвращать результат от каждого вызова внешней службе, нам нужно хранить каждый вызов в массиве и отображать массив в ответе. Что-то вроде следующего:

 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

 

Комментарии:

1. Спасибо. Это работает. Но я получаю более красную ошибку «AbstractController::DoubleRenderError (Рендеринг и/или перенаправление вызывались несколько раз в этом действии. Пожалуйста, обратите внимание, что вы можете вызывать рендеринг ИЛИ перенаправление только один раз за действие. Также обратите внимание, что ни перенаправление, ни рендеринг не завершают выполнение действия, поэтому, если вы хотите завершить действие после перенаправления, вам нужно сделать что-то вроде «перенаправить на(…) и вернуться».):

2. Мне нужно создать шоу изменений. Если попытаться выполнить с show, я получаю ошибку «AbstractController::ActionNotFound (действие «создать» не удалось найти для Api::V1::ExecutionsSetController):

3. Мелчер — Я обновил код, который работает и получает только один ответ для Mac, который выполняется последним. Как получить весь ответ на все выполнение Mac?

4. {«Mac_адрес»:»10.X.X.X»,»Ответ»:{«параметры»:[{«имя»:»Устройство. Wi-Fi»,»сообщение»:»Успех»}],»Код состояния»:200}}

5. Выше ответ, который я получаю, если я выполняю для большего количества Mac-адресов