2014-06-24 8 views
0

XML로 POST 요청에서 컨트롤러의 XML 데이터를 가져 오는 데 문제가 있습니다. 문자열 변수에 XML을 저장하면 Nokogiri와 함께 irb에서 XML 데이터를 파싱 할 수 있습니다. 그러나 POST 요청에서 XML 데이터가 제공되는 매개 변수가없는 것 같습니다. XML 데이터를 잡는 방법에 대한 올바른 방향을 제시하는 데 도움이 될 것입니다!레일 컨트롤러에서 XML 데이터를 가져올 수 없습니다.

Started POST "/vz_api" for 127.0.0.1 at 2014-06-24 10:59:07 -0400 
Processing by LocationsController#vz_api as */* 

f = '<?xml version="1.0" encoding="UTF-8" standalone="no"?><NetworkfleetMessage Type="GPS"><VIN>1M2AXO4C5CM014389</VIN><FleetId>47790</FleetId><MsgId>25195315419</MsgId><MessageTime>2014-06-24 10:09:46 GMT</MessageTime><MessageTimeUTF>1403604586</MessageTimeUTF><DeliveryStatus>Current</DeliveryStatus><GPSFixes NumFixes="1"><GPSFix><FixTime>2014-06-24 10:08:59 GMT</FixTime><FixTimeUTF>1403604539</FixTimeUTF><Latitude>40.83705</Latitude><Longitude>-73.87563</Longitude><Ignition>On</Ignition><Speed Type="Avg" Units="MPH">0</Speed><Speed Type="Inst" Units="MPH">0</Speed><Speed Type="Max" Units="MPH">0</Speed><Odometer>51525.976</Odometer><AgeInMiles>0.000</AgeInMiles></GPSFix></GPSFixes></NetworkfleetMessage>' 
2.0.0-p353 :003 > require 'nokogiri' 
=> false 
2.0.0-p353 :004 > doc = Nokogiri::XML(f) 
=> #<Nokogiri::XML::Document:0x8270cf4c name="document" children=[#<Nokogiri::XML::Element:0x8270cbdc name="NetworkfleetMessage" attributes=[#<Nokogiri::XML::Attr:0x8270cb78 name="Type" value="GPS">] children=[#<Nokogiri::XML::Element:0x8270c5c4 name="VIN" children=[#<Nokogiri::XML::Text:0x8270c31c "1M2AXO4C5CM014389">]>, #<Nokogiri::XML::Element:0x8270c1a0 name="FleetId" children=[#<Nokogiri::XML::Text:0x82710638 "47790">]>, #<Nokogiri::XML::Element:0x82711f24 name="MsgId" children=[#<Nokogiri::XML::Text:0x82711c04 "25195315419">]>, #<Nokogiri::XML::Element:0x827119c0 name="MessageTime" children=[#<Nokogiri::XML::Text:0x82711768 "2014-06-24 10:09:46 GMT">]>, #<Nokogiri::XML::Element:0x827115ec name="MessageTimeUTF" children=[#<Nokogiri::XML::Text:0x827113a8 "1403604586">]>, #<Nokogiri::XML::Element:0x82711204 name="DeliveryStatus" children=[#<Nokogiri::XML::Text:0x82710ffc "Current">]>, #<Nokogiri::XML::Element:0x82710e80 name="GPSFixes" attributes=[#<Nokogiri::XML::Attr:0x82710e1c name="NumFixes" value="1">] children=[#<Nokogiri::XML::Element:0x8271096c name="GPSFix" children=[#<Nokogiri::XML::Element:0x82710688 name="FixTime" children=[#<Nokogiri::XML::Text:0x82710444 "2014-06-24 10:08:59 GMT">]>, #<Nokogiri::XML::Element:0x8271023c name="FixTimeUTF" children=[#<Nokogiri::XML::Text:0x82714620 "1403604539">]>, #<Nokogiri::XML::Element:0x82715f70 name="Latitude" children=[#<Nokogiri::XML::Text:0x82715c00 "40.83705">]>, #<Nokogiri::XML::Element:0x82715a84 name="Longitude" children=[#<Nokogiri::XML::Text:0x827158a4 "-73.87563">]>, #<Nokogiri::XML::Element:0x827156c4 name="Ignition" children=[#<Nokogiri::XML::Text:0x827154bc "On">]>, #<Nokogiri::XML::Element:0x82715318 name="Speed" attributes=[#<Nokogiri::XML::Attr:0x827152b4 name="Type" value="Avg">, #<Nokogiri::XML::Attr:0x827152a0 name="Units" value="MPH">] children=[#<Nokogiri::XML::Text:0x82714bc0 "0">]>, #<Nokogiri::XML::Element:0x8271497c name="Speed" attributes=[#<Nokogiri::XML::Attr:0x827148b4 name="Type" value="Inst">, #<Nokogiri::XML::Attr:0x827148a0 name="Units" value="MPH">] children=[#<Nokogiri::XML::Text:0x827183c4 "0">]>, #<Nokogiri::XML::Element:0x82719fbc name="Speed" attributes=[#<Nokogiri::XML::Attr:0x82719ecc name="Type" value="Max">, #<Nokogiri::XML::Attr:0x82719eb8 name="Units" value="MPH">] children=[#<Nokogiri::XML::Text:0x82719814 "0">]>, #<Nokogiri::XML::Element:0x82719670 name="Odometer" children=[#<Nokogiri::XML::Text:0x82719490 "51525.976">]>, #<Nokogiri::XML::Element:0x82719314 name="AgeInMiles" children=[#<Nokogiri::XML::Text:0x8271910c "0.000">]>]>]>]>]> 
2.0.0-p353 :005 > doc.xpath("//VIN").inner_text 
=> "1M2AXO4C5CM014389" 

답변

1

요청 객체를 사용하여 시도하고 요청의 본문을 읽고 다음 구문 분석 구문 분석 컨트롤러 코드

def vz_api 
    require 'nokogiri' 
    puts params # {"controller"=>"locations", "action"=>"vz_api"} 
    xml_doc = Nokogiri::XML(params["_data"]) 
    puts xml_doC# <?xml version="1.0"?> 
    vin = xml_doc.xpath("//VIN").inner_text 
    @truck = Truck.find_by(vin: vin) if vin.present? 
    lat = xml_doc.xpath("//Latitude").inner_text 
    lng = xml_doc.xpath("//Longitude").inner_text 
    @location = @truck.location 
    respond_to do |format| 
    if @location.update_attributes(longitude: lng, latitude: lat) 
     format.xml { render xml: @location } 
    else 
     format.xml { render xml: @location.errors, status: :unprocessable_entity } 
    end 
    end 
end 

IRB XML 노코 기리

require 'nokogiri' 
xml_doc = Nokogiri::XML(request.body.read) 
관련 문제