ruby - проблема с преобразованием тела ответа http из xml в hash - ошибка цитаты отсутствующего атрибута - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблемы с преобразованием тела ответа http из XML в хэш в ruby. Я взаимодействую с Soalrwinds Orion API.

def submitCorePluginConfigRequest()
  corePluginContext = [{"name":"item 1"},{"name": "item2}]
  uri = URI.parse("https://examplesolarwinds.com:17778/SolarWinds/InformationService/v3/Json/Invoke/Orion.Discovery/CreateCorePluginConfiguration")

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Post.new(uri.request_uri, initheader = { "Content-Type" => "application/json" })
  request.body = corePluginContext.to_json
  request.basic_auth("username", "password")

  response = http.request(request)
  hash_response = Hash.from_xml(response.body)

  return hash_response
end

Hash.from_xml ошибки с missing attribute quote (REXML::ParseException)

response.body (в формате) выглядит следующим образом:

"<?xml version=\"1.0\" encoding=\"utf-16\"?>
<PluginItems>
    <knownTypes>
        <ArrayOfstring
            xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"
            xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">
            <string>SolarWinds.Orion.Core.Models.Discovery.CoreDiscoveryPluginConfiguration,SolarWinds.Orion.Core.Models.V1</string>
        </ArrayOfstring>
    </knownTypes>
    <pluginItem>
        <ArrayOfDiscoveryPluginConfigurationBase
            xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"
            xmlns=\"http://schemas.datacontract.org/2004/07/SolarWinds.Orion.Core.Models.Discovery\">
            <DiscoveryPluginConfigurationBase
                xmlns:d2p1=\"http://schemas.solarwinds.com/2008/Orion\" i:type=\"d2p1:CoreDiscoveryPluginConfiguration\">
                <d2p1:ActiveDirectoryList />
                <d2p1:AddressRange />
                <d2p1:AgentsAddresses
                    xmlns:d3p1=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\" />
                    <d2p1:AutoImportVolumeTypes
                        xmlns:d3p1=\"http://schemas.datacontract.org/2004/07/SolarWinds.Common.Snmp\" i:nil=\"true\" />
                        <d2p1:BulkList
                            xmlns:d3p1=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">
                            <d3p1:string>10.83.4.77</d3p1:string>
                        </d2p1:BulkList>
                        <d2p1:Credentials>
                            <d2p1:credentials>
                                <knownTypes>
                                    <ArrayOfstring
                                        xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"
                                        xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\" />
                                    </knownTypes>
                                    <pluginItem>
                                        <d2p1:ArrayOfCredential
                                            xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" />
                                        </pluginItem>
                                    </d2p1:credentials>
                                </d2p1:Credentials>
                                <d2p1:DiscoverAgentNodes>false</d2p1:DiscoverAgentNodes>
                                <d2p1:PreferredPollingMethod>SNMP</d2p1:PreferredPollingMethod>
                                <d2p1:SharedCredentials
                                    xmlns:d3p1=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\" />
                                    <d2p1:SubnetList />
                                    <d2p1:WMICredentials />
                                    <d2p1:WmiRetries>0</d2p1:WmiRetries>
                                    <d2p1:WmiRetryInterval>PT1S</d2p1:WmiRetryInterval>
                                </DiscoveryPluginConfigurationBase>
                            </ArrayOfDiscoveryPluginConfigurationBase>
                        </pluginItem>
                    </PluginItems>"

Когда я копирую этот xml и объявляю его как строку явно (то есть testxml = above xml), Hash.from_xml(testxml) работает нормально и выводит хеш. Вышеуказанный xml действителен, а response.body содержит кавычки, поэтому я не могу понять, почему в нем говорится, что он пропустил кавычку. Я пытался использовать response.parsed_response, я пытался использовать response.body.to_s, я пытался использовать простой XML.

1 Ответ

0 голосов
/ 03 ноября 2018

Хорошо, я нашел что-то, что сработало для меня.

После запроса я попытался использовать анализатор JSON:

json_response = JSON.parse(response.body)

Но это просто превратило тело ответа в немного другой XML, а не в JSON. Но затем, используя этот другой xml, hash_response = Hash.from_xml(json_response) работал, чтобы превратить ответ в хеш.

Не совсем уверен, что со всем этим происходит, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...