代码之家  ›  专栏  ›  技术社区  ›  Caio Sant'Anna

rest web api xml bind-asp.net mvc

  •  0
  • Caio Sant'Anna  · 技术社区  · 8 年前

    我正在restapspnetwebapi中创建post方法,以通过json或xml接收数据。我需要处理无法更改的特定XML结构:

    <data>
     <t>
        <id>sample string 1</id>
        <cnpj>sample string 2</cnpj>
        <datatransacao>sample string 3</datatransacao>
        <valorarredondado>sample string 4</valorarredondado>
        <grupo>sample string 5</grupo>
        <meiopagamento>sample string 6</meiopagamento>
        <parcelas>sample string 7</parcelas>
        <cpf>sample string 8</cpf>
        <nome>sample string 9</nome>
        <email>sample string 10</email>
        <codoperador>sample string 11</codoperador>
      </t>
      <t>
        <id>sample string 1</id>
        <cnpj>sample string 2</cnpj>
        <datatransacao>sample string 3</datatransacao>
        <valorarredondado>sample string 4</valorarredondado>
        <grupo>sample string 5</grupo>
        <meiopagamento>sample string 6</meiopagamento>
        <parcelas>sample string 7</parcelas>
        <cpf>sample string 8</cpf>
        <nome>sample string 9</nome>
        <email>sample string 10</email>
        <codoperador>sample string 11</codoperador>
      </t>
    </data>
    

    为此,我创建了一个方法:

    [HttpPost]
    public HttpResponseMessage Post([FromUri] string Token, [FromBody] List<t> data)
    {
        return Request.CreateResponse(HttpStatusCode.OK, "");
    }
    

    它基本上是一个标记和一个t列表

    public class t
    {
        public string id { get; set; }
        public string cnpj { get; set; }
        public string datatransacao { get; set; }
        public string valorarredondado { get; set; }
        public string grupo { get; set; }
        public string meiopagamento { get; set; }
        public string parcelas { get; set; }
        public string cpf { get; set; }
        public string nome { get; set; }
        public string email { get; set; }
        public string codoperador { get; set; }
    }
    

    有了这个,我在测试时得到了一个空值。只有在发送时,所有内容才能正确绑定:

    <ArrayOfT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <t>
        <id>sample string 1</id>
        <cnpj>sample string 2</cnpj>
        <datatransacao>sample string 3</datatransacao>
        <valorarredondado>sample string 4</valorarredondado>
        <grupo>sample string 5</grupo>
        <meiopagamento>sample string 6</meiopagamento>
        <parcelas>sample string 7</parcelas>
        <cpf>sample string 8</cpf>
        <nome>sample string 9</nome>
        <email>sample string 10</email>
        <codoperador>sample string 11</codoperador>
      </t>
      <t>
        <id>sample string 1</id>
        <cnpj>sample string 2</cnpj>
        <datatransacao>sample string 3</datatransacao>
        <valorarredondado>sample string 4</valorarredondado>
        <grupo>sample string 5</grupo>
        <meiopagamento>sample string 6</meiopagamento>
        <parcelas>sample string 7</parcelas>
        <cpf>sample string 8</cpf>
        <nome>sample string 9</nome>
        <email>sample string 10</email>
        <codoperador>sample string 11</codoperador>
      </t>
    </ArrayOfT>
    

    我的API当前设置为与XmlSerializer一起使用

    config.Formatters.XmlFormatter.UseXmlSerializer = true;
    

    在我的测试中,我成功地用代码序列化了XML:

    var postStream = Request.Content.ReadAsStreamAsync().Result;
    postStream.Seek(0, SeekOrigin.Begin);
    string postBodyString = new StreamReader(postStream).ReadToEnd();
    
    StringReader stringReader = new StringReader(postBodyString);
    XmlSerializer serializer = new XmlSerializer(typeof(List<t>), new XmlRootAttribute("data"));
    List<t> ListOfT = (List<t>)serializer.Deserialize(stringReader);
    

    我想知道,仅仅考虑到方法的签名和XML,框架是否可以绑定所有内容。到目前为止,我还没能做到。

    谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   Mukesh Modhvadiya    8 年前

    再添加一个类

    [XmlRoot(ElementName = "data")]
    public class Data {
        [XmlElement(ElementName = "t")]
        public List<t> data { get; set; }
    }
    

    使用它作为方法的参数。应该绑好。

    [HttpPost]
    public HttpResponseMessage Post([FromUri] string Token, [FromBody] Data data)
    

    同时向t类添加xmlroot属性

    [XmlRoot(ElementName = "t")]
    public class t
    {
        public string id { get; set; }
        public string cnpj { get; set; }
        ...
    }
    
    推荐文章