欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-22 08:08:05
前言 asp.net web api是​​一个框架,可以很容易构建达成了广泛的http服务客户端,包括浏览器和移动设备。是构建restful应用程...

前言

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

遍历文件内容,获取数据

总结

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