Создание XML-запроса с RestSharp

Я пытаюсь работать с REST API, используя RestSharp и C #. В документации к API, который я использую, приведен образец XML-запроса:

<?xml version='1.0' encoding='UTF-8'?>  
<messages>  
 <accountreference>EX0000000</accountreference> 
 <from>07700900654</from>
 <message>  
  <to>07700900123</to>  
  <type>SMS</type>  
  <body>Hello Mr Sands.</body>
 </message>  
 <message>  
  <to>07700900124</to>  
  <type>SMS</type>  
  <body>Hello Mr Mayo.</body>
 </message>  
</messages>

Я изо всех сил пытаюсь понять, как создать запрос в желаемом формате (несколько элементов, называемых «сообщение»).

Я создал эти классы для сериализации RestSharp:

public class messages
{
    public string accountreference { get; set; }

    public string from { get; set; }

    public message message { get; set; }
}

public class message
{
    public string to { get; set; }

    public string body { get; set; }
}

А вот мой код RestSharp:

var client = new RestClient("http://api.url.com/v1.0")
                         {
                             Authenticator =
                                 new HttpBasicAuthenticator(
                                 UserName,
                                 Password)
                         };

var request = new RestRequest("theresource", Method.POST) { RequestFormat = DataFormat.Xml };

request.AddBody(
    new messages
        {
            accountreference = Configuration.AccountReference,
            from = Configuration.From,
            message =
                new message { to = Configuration.Message.To, body = Configuration.Message.Body }
        });

var response = client.Execute(request);

Это отлично работает, когда у меня есть только 1 элемент сообщения, но я не знаю, как создать несколько элементов сообщения, не вкладывая их в массив, что не работает с API.


person Glen Thomas    schedule 30.12.2015    source источник


Ответы (2)


По умолчанию RestSharp использует свой собственный сериализатор, но он также упаковывает DotNetSerializer, поэтому вы можете достичь своей цели, изменив сериализатор следующим образом:

var request = new RestRequest("theresource", Method.POST) 
{ 
    RequestFormat = DataFormat.Xml, 
    XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer() 
};

Затем вы можете использовать список объектов message и украсить его атрибутом XmlElement:

public class messages
{
    public string accountreference { get; set; }

    public string from { get; set; }

    [XmlElement("message")]
    public List<message> messageList { get; set; }
}


public class message
{
    public string to { get; set; }

    public string body { get; set; }
}

Затем вы можете изменить последний бит, чтобы добавить несколько сообщений:

request.AddBody(
    new messages
    {
        accountreference = "ref",
        from = "from",
        messageList = new List<message>() {
                new message { to = "to1", body = "body1" },
                new message { to = "to2", body = "body2" }
                }
    }); 

который выдаст (я получил XML, проверив request.Parameters [0] .Value):

<?xml version="1.0" encoding="utf-8"?>
<messages>
  <accountreference>ref</accountreference>
  <from>from</from>
  <message>
    <to>to1</to>
    <body>body1</body>
  </message>
  <message>
    <to>to2</to>
    <body>body2</body>
  </message>
</messages>

Думаю, это именно тот формат XML, который вы так долго искали.

person Volkan Paksoy    schedule 04.01.2016
comment
Спасибо! XmlSerializer по умолчанию в RestSharp просто давал мне ‹ClassName /› в качестве значения для параметров [0]. Добавил XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer(), и все заработало! - person Andrew Steitz; 02.08.2018

Наличие сообщения в виде списка будет работать -

public class messages
{
    public string accountreference { get; set; }

    public string from { get; set; }

    public List<message> message { get; set; }
}

public class message
{
    public string to { get; set; }

    public string body { get; set; }
}

Проверьте самый последний ответ здесь -

Как отправить массив сложных объектов с помощью JSON, jQuery в контроллер ASP.NET MVC?

Если у вас возникли проблемы со списком, попробуйте это -

Может ли RestSharp отправить список ‹string› в запросе POST? < / а>

person Arvin    schedule 30.12.2015