【问题标题】:Parse Json Request from CURL in Rails在 Rails 中解析来自 CURL 的 Json 请求
【发布时间】:2021-10-19 10:22:21
【问题描述】:

我需要从 curl 请求中解析 Json 数据。需要从下面的 curl 请求中拆分 Mac、参数、数据类型、值,并将这些数据作为 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    


【问题讨论】:

  • 不确定我是否理解您的问题。我相信您的 CURL 请求的 JSON 内容格式不正确,您需要将 mac 地址 JSON 对象列表包装在一个数组中。像{"Data": [{"Mac":"..."},{}]} 这样的东西。然后,Rails 将解析 JSON 正文内容,并为您提供包含 JSON 对象中键和值的哈希数组。例如params["Data"] 是对象数组,params["Data"].map{|mac_object| mac_object["Mac"]} 是 MAC 地址数组。

标签: ruby-on-rails ruby-on-rails-4


【解决方案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 正文并将其解析为 params 哈希。如果不是,这是一个可以解决的单独问题。

更新

为了将每次调用的结果返回给外部服务,我们需要将每个调用存储在一个数组中并在响应中呈现该数组。类似于以下内容:

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

【讨论】:

  • 谢谢。它正在工作。但我收到更红的错误“AbstractController::DoubleRenderError(在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每个动作最多一次。还要注意,重定向和渲染都不会终止动作的执行,所以如果你想在重定向后退出一个动作,你需要做一些类似“redirect_to(...) and return”的事情。):
  • 我已更改 show 以创建。如果尝试使用 show 执行,我收到错误“AbstractController::ActionNotFound(找不到 Api::V1::ExecutionsSetController 的操作 'create'):
  • Melcher- 我已经更新了代码,该代码在最后执行的 Mac 上工作并且只获得一个响应。如何获得所有 Mac 执行的所有响应?
  • {"Mac_address":"10.XXX","Response":{"parameters":[{"name":"Device.Wifi","message":"Success"}], “状态代码”:200}}
  • 如果我为更多 Mac 地址执行,我会得到以上响应
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多