【问题标题】:Building XML request with RestSharp使用 RestSharp 构建 XML 请求
【发布时间】:2015-12-30 10:45:38
【问题描述】:

我正在尝试使用 RestSharp 和 C# 使用 REST API。 我正在使用的 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。

【问题讨论】:

    标签: c# xml rest restsharp


    【解决方案1】:

    默认情况下,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" }
                    }
        }); 
    

    这会产生(我通过检查 request.Parameters[0].Value 得到了 XML):

    <?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 格式。

    【讨论】:

    • 谢谢! RestSharp 中的默认 XmlSerializer 只是将 作为参数 [0] 的值。添加了XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer(),它就起作用了!
    【解决方案2】:

    将消息作为列表将起作用 -

    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; }
    }
    

    在这里查看最后一个答案 -

    How to post an array of complex objects with JSON, jQuery to ASP.NET MVC Controller?

    如果你遇到列表问题,试试这个 -

    Can RestSharp send a List<string> in a POST request?

    【讨论】:

    • 这不起作用,生成的 XML 包含一组 元素嵌套在 元素中。
    • 您是否可以分享您正在使用的 API 详细信息。
    • 请确保您已经尝试过 - stackoverflow.com/questions/12284931/…
    • 细节都在我的问题里。我需要创建如图所示的 XML 请求正文。
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多