Как мне перебрать список из вызова REST, используя RestSharp? - PullRequest
1 голос
/ 11 апреля 2019

Я относительно новичок в вызовах REST и, вероятно, новичок в переходе на C #.Я пытаюсь позвонить в Qualys REST для получения информации об устройстве.Моя проблема заключается в том, что когда я выполняю цикл foreach для итерации по списку, консольное приложение завершается сбоем, просто выходя после ввода учетных данных.Я подтвердил, что API принимает мои учетные данные.

Имейте в виду, что я подключаюсь к Qualys с помощью HttpBasicAuthenticator и использую комбинацию RestSharp и XmlSerializer.Я не знаю, правильно ли я это делаю, но вот что я получил до сих пор.Я хотел бы полностью использовать RestSharp, но я совершенно не понимаю, что делать с частью десериализации, поэтому я попытался поработать с XmlSerializer, используя некоторые примеры из Интернета.

class Program
    {
        const string BaseUrl = "https://qualysapi.qualys.com/";        

        static void Main(string[] args)
        {        
            Console.WriteLine("Username: ");
            var username = Console.ReadLine();
            Console.WriteLine("Password: ");
            var password = Console.ReadLine();

            var _client = new RestClient(BaseUrl);
            _client.Authenticator = new HttpBasicAuthenticator(username, password);

            var request = new RestRequest("api/2.0/fo/appliance/", Method.GET);
            request.AddHeader("X-Requested-With", "REST");
            request.AddParameter("action", "list");
            request.AddParameter("output_mode", "brief");
            var response = _client.Execute(request).Content;

            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "APPLIANCE_LIST_OUTPUT";
            xRoot.IsNullable = true;
            XmlSerializer serializer = new XmlSerializer(typeof(List<Appliance>), xRoot);
            StringReader stringReader = new StringReader(response);
            List<Appliance> applianceValues = (List<Appliance>)serializer.Deserialize(stringReader);

            foreach (var i in applianceValues)
            {
                Console.WriteLine("ID: " + i.ID);
                Console.WriteLine("UUID: " + i.UUID);
                Console.WriteLine("Name: " + i.NAME);
                Console.WriteLine("Software Version: " + i.SOFTWARE_VERSION);
                Console.WriteLine("Status: " + i.STATUS);
            }          
        }        
    }

 public class Appliance
    {
        [XmlElement(ElementName = "id")]
        public string ID { get; set; }

        [XmlElement(ElementName = "uuid")]
        public int UUID { get; set; }

        [XmlElement(ElementName = "name")]
        public string NAME { get; set; }

        [XmlElement(ElementName = "software_ver")]
        public int SOFTWARE_VERSION { get; set; }

        [XmlElement(ElementName = "status")]
        public string STATUS { get; set; }
    }

Response: Я получил этот ответ, комментируя цикл foreach и просто Console.WriteLine(response);

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE APPLIANCE_LIST_OUTPUT SYSTEM "https://qualysapi.qualys.com/api/2.0/fo/appliance/appliance_list_output.dtd">
<APPLIANCE_LIST_OUTPUT>
  <RESPONSE>
    <DATETIME>2019-04-11T12:31:49Z</DATETIME>
    <APPLIANCE_LIST>
      <APPLIANCE>
        <ID>111111</ID>
        <UUID>1a2b3c4d-14qw-f00f-6744-g7455556bnf4</UUID>
        <NAME>My Appliance</NAME>
        <SOFTWARE_VERSION>2.6</SOFTWARE_VERSION>
        <RUNNING_SLICES_COUNT>0</RUNNING_SLICES_COUNT>
        <RUNNING_SCAN_COUNT>0</RUNNING_SCAN_COUNT>
        <STATUS>Online</STATUS>
      </APPLIANCE>
      <APPLIANCE>
        <ID>222222</ID>
        <UUID>bv51gh82-g496-88g8-8999-11abcd4567kk</UUID>
        <NAME>My Other Appliance</NAME>
        <SOFTWARE_VERSION>2.6</SOFTWARE_VERSION>
        <RUNNING_SLICES_COUNT>0</RUNNING_SLICES_COUNT>
        <RUNNING_SCAN_COUNT>0</RUNNING_SCAN_COUNT>
        <STATUS>Offline</STATUS>
      </APPLIANCE>
    </APPLIANCE_LIST>
  </RESPONSE>
</APPLIANCE_LIST_OUTPUT>

Сейчас моя цель - просто вывести на консоль хороший список некоторых полейиз XML.Любая помощь будет принята с благодарностью.

Примечание. Я изменил некоторые значения (ID, UUID, NAME) в ответ на конфиденциальность.

1 Ответ

0 голосов
/ 11 апреля 2019

Попробуйте следующее.Похоже, вам нужно отключить обработку DTD:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication108
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            StringReader sReader = new StringReader(xml);

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Ignore;
            XmlReader reader = XmlReader.Create(sReader, settings);

            XmlSerializer serializer = new XmlSerializer(typeof(ApplianceOutput));
            ApplianceOutput applicance = (ApplianceOutput)serializer.Deserialize(reader);

        }
    }
    [XmlRoot("APPLIANCE_LIST_OUTPUT")]
    public class ApplianceOutput
    {
        [XmlElement("RESPONSE")]
        public Response response { get; set; }
    }
    [XmlRoot("RESPONSE")]
    public class Response
    {
        public DateTime date { get; set; }
        [XmlArray("APPLIANCE_LIST")]
        [XmlArrayItem("APPLIANCE")]
        public List<Appliance> appliances { get; set; }
    }
    public class Appliance
    {
        public string ID { get; set; }
        public string UUID { get; set; }
        public string NAME { get; set; }
        public string SOFTWARE_VERSION { get; set; }
        public int RUNNING_SLICES_COUNT { get; set; }
        public int RUNNING_SCAN_COUNT { get; set; }
        public string STATUS { get; set; }
    }

}
...