#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-адресов