.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方法,所以我想到了三種可能:

  • 對方通過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;
        }

遍歷文件內容,獲取數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM