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;
}
遍歷文件內容,獲取數據