.net webapi 接收 xml 格式数据的三种情况

1|0webapi 接收 xml 的三种方法


前段时间接到一个任务写一个小接口,要接收java端返回过来的短信xml数据。

刚拿到项目,我的第一想法是对方会以什么形式发送xml格式的数据给我呢,设想三种情况。

我一开始拿到手上的是一串xml格式字符串。如下

<?xml version="1.0" encoding="utf-8"?> <returnForm> <type>2</type> <count>1</count> <list> <pushSmsForm> <eprId>0</eprId> <mobile>13560739262</mobile> <msgId>30217002</msgId> <content> <![CDATA[回复内容]]> </content> <userId>id</userId> <extNum>扩展号</extNum> <recvNum/> </pushSmsForm> <pushSmsForm> <eprId>0</eprId> <mobile>13560739261</mobile> <msgId>30217001</msgId> <content> <![CDATA[回复内容]]> </content> <userId>id</userId> <extNum>扩展号</extNum> <recvNum/> </pushSmsForm> </list> </returnForm>

思路

这个xml的基本知识我就不一一介绍了,简单说一下<![CDATA[ ]]>标志,里面的内容是没有限制的(除了< 和 >)。继续讲思路,文档中只说了是post方法,所以我想到了三种可能:

  • 对方通过form表单提交了一个xml文件,我需要用文件流(filestream)读取文件,并进行转化为实体类
  • 对方通过post了一个字符串过来,我接收字符串并转化为实体类。
  • 对方直接在请求里添加了xml字符串(text/xml)
  • 先构建两个xml反序列化的帮助类
        /// <summary>          /// 反序列化          /// </summary>          /// <param name="type">类型</param>          /// <param name="xml">XML字符串</param>         /// <returns></returns>          public static object Deserialize(Type type, string xml)         {             using (StringReader sr = new StringReader(xml))             {                 XmlSerializer xmldes = new XmlSerializer(type);                 return xmldes.Deserialize(sr);             }         }         /// <summary>          /// 反序列化          /// </summary>          /// <param name="type"></param>          /// <param name="xml"></param>          /// <returns></returns>          public static object Deserialize(Type type, Stream stream)         {             XmlSerializer xmldes = new XmlSerializer(type);             return xmldes.Deserialize(stream);         }
  • 利用visual studio自带的功能xml生成类(编辑-->选择性粘贴-->paste xml as classes)
[System.SerializableAttribute()]     [System.ComponentModel.DesignerCategoryAttribute("code")]     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]     public partial class returnFormPushSmsForm     {         private int eprIdField;         private string mobileField;         private string msgIdField;         private string contentField;         private string userIdField;         private string extNumField;         private string recvNumField;         /// <remarks/>         public int eprId         {             get             {                 return this.eprIdField;             }             set             {                 this.eprIdField = value;             }         }         /// <remarks/>         public string mobile         {             get             {                 return this.mobileField;             }             set             {                 this.mobileField = value;             }         }         /// <remarks/>         public string msgId         {             get             {                 return this.msgIdField;             }             set             {                 this.msgIdField = value;             }         }         /// <remarks/>         public string content         {             get             {                 return this.contentField;             }             set             {                 this.contentField = value;             }         }         /// <remarks/>         public string userId         {             get             {                 return this.userIdField;             }             set             {                 this.userIdField = value;             }         }         /// <remarks/>         public string extNum         {             get             {                 return this.extNumField;             }             set             {                 this.extNumField = value;             }         }         /// <remarks/>         public string recvNum         {             get             {                 return this.recvNumField;             }             set             {                 this.recvNumField = value;             }         }     }

生成类之后注意一下数据类型需要根据需求做一些修改

  • 接下来就开始写第一个接口,最简单的直接接收字符串
[HttpPost, Route("get/context")]         public int getContext(context_ context)         {             bool result = false;             //短信数据             returnForm context_data = XmlSerializeUtil.Deserialize(typeof(returnForm), context.context) as returnForm;             if (context_data != null && context_data.count > 0)             {                 result = UpdateDB(context_data);             }             return result ? 100 : 500;         }

这里我定义了一个类context_,调用之前写的方法反序列化实体类,再写入数据库

  • 第二个接口时接收请求中的xml(text/xml)
[HttpPost, Route("get/context")]         public int getContext(context_ context)         {             bool result = false;             //短信数据             returnForm context_data = XmlSerializeUtil.Deserialize(typeof(returnForm), HttpContext.Current.Request.InputStream) as returnForm;             if (context_data != null && context_data.count > 0)             {                 result = UpdateDB(context_data);             }             return result ? 100 : 500;         }

这里读取了请求中的内容,HttpContext.Current.Request.InputStream

  • 第三种是读取文件
[HttpPost, Route("get/context")]         public int getContext(context_ context)         {             bool result = false;             HttpFileCollection files = HttpContext.Current.Request.Files;             foreach (string key in files.AllKeys)             {                 HttpPostedFile file1 = files[key];                 file1.InputStream.ToString();                 returnForm context_data = XmlSerializeUtil.Deserialize(typeof(returnForm), file1.InputStream) as returnForm;                 if (context_data != null && context_data.count > 0)                 {                     result = UpdateDB(context_data);                 }             }             return result ? 100 : 500;         }

遍历文件内容,获取数据


__EOF__

本文作者野菊花
本文链接https://www.cnblogs.com/Jackyye/p/10374507.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   野菊花  阅读(7473)  评论(3编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示