当前位置: 移动技术网 > IT编程>开发语言>.net > .net webapi接收xml格式数据的3种情况小结

.net webapi接收xml格式数据的3种情况小结

2019年03月20日  | 移动技术网IT编程  | 我要评论

6岁裸娃街头游荡,吉林市新闻网,意大利奇异果

前言

asp.net web api是​​一个框架,可以很容易构建达成了广泛的http服务客户端,包括浏览器和移动设备。是构建restful应用程序的理想平台的.net框架。

本文主要给大家介绍了关于.net webapi接收xml格式数据的相关内容,下面话不多说了,来一起看看详细的介绍吧

webapi 接收 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方法,所以我想到了三种可能:

  1. 对方通过form表单提交了一个xml文件,我需要用文件流(filestream)读取文件,并进行转化为实体类
  2. 对方通过post了一个字符串过来,我接收字符串并转化为实体类。
  3. 对方直接在请求里添加了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;
  }

遍历文件内容,获取数据

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网