.net webapi接收xml格式數(shù)據(jù)的3種情況小結
前言
ASP.NET Web API是一個框架,可以很容易構建達成了廣泛的HTTP服務客戶端,包括瀏覽器和移動設備。是構建RESTful應用程序的理想平臺的.NET框架。
本文主要給大家介紹了關于.net webapi接收xml格式數(shù)據(jù)的相關內(nèi)容,下面話不多說了,來一起看看詳細的介紹吧
webapi 接收 xml 的三種方法
前段時間接到一個任務寫一個小接口,要接收java端返回過來的短信xml數(shù)據(jù)。
剛拿到項目,我的第一想法是對方會以什么形式發(fā)送xml格式的數(shù)據(jù)給我呢,設想三種情況。
我一開始拿到手上的是一串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[回復內(nèi)容]]> </content> <userId>id</userId> <extNum>擴展號</extNum> <recvNum/> </pushSmsForm> <pushSmsForm> <eprId>0</eprId> <mobile>13560739261</mobile> <msgId>30217001</msgId> <content> <![CDATA[回復內(nèi)容]]> </content> <userId>id</userId> <extNum>擴展號</extNum> <recvNum/> </pushSmsForm> </list> </returnForm>
思路
這個xml的基本知識我就不一一介紹了,簡單說一下<![CDATA[ ]]>標志,里面的內(nèi)容是沒有限制的(除了< 和 >)。繼續(xù)講思路,文檔中只說了是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;
}
}
}
生成類之后注意一下數(shù)據(jù)類型需要根據(jù)需求做一些修改
接下來就開始寫第一個接口,最簡單的直接接收字符串
[HttpPost, Route("get/context")]
public int getContext(context_ context)
{
bool result = false;
//短信數(shù)據(jù)
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_,調(diào)用之前寫的方法反序列化實體類,再寫入數(shù)據(jù)庫
第二個接口時接收請求中的xml(text/xml)
[HttpPost, Route("get/context")]
public int getContext(context_ context)
{
bool result = false;
//短信數(shù)據(jù)
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;
}
這里讀取了請求中的內(nèi)容,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;
}
遍歷文件內(nèi)容,獲取數(shù)據(jù)
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- ASP.net WebAPI 上傳圖片實例
- Asp.net core WebApi 使用Swagger生成幫助頁實例
- ASP.NET Core 2.0 WebApi全局配置及日志實例
- ASP.NET WebAPi(selfhost)實現(xiàn)文件同步或異步上傳
- 淺談ASP.Net Core WebApi幾種版本控制對比
- 為ASP.NET MVC及WebApi添加路由優(yōu)先級
- 在CentOS6.5上使用Jexus安裝部署ASP.NET MVC4和WebApi
- asp.net core 2.0 webapi集成signalr(實例講解)
- ASP.Net WebAPI與Ajax進行跨域數(shù)據(jù)交互時Cookies數(shù)據(jù)的傳遞
- asp.net mvc webapi 實用的接口加密方法示例
相關文章
.NET微信開發(fā)之PC 端微信掃碼注冊和登錄功能實現(xiàn)
這篇文章主要介紹了.NET微信開發(fā)之PC 端微信掃碼注冊和登錄功能實現(xiàn)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
Entity Framework使用Code First模式管理事務
本文詳細講解了Entity Framework使用Code First模式管理事務的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
.NET實現(xiàn)倉儲Repository(AI)的操作方法
倉儲模式是一種在應用程序中使用的設計模式,它將數(shù)據(jù)訪問邏輯與業(yè)務邏輯分離,通過倉儲接口和倉儲實現(xiàn)類,您可以定義和實現(xiàn)數(shù)據(jù)的增刪改查操作,這篇文章主要介紹了.NET?實現(xiàn)倉儲Repository(AI),需要的朋友可以參考下2023-09-09
ASP.NET MVC從控制器傳遞數(shù)據(jù)到視圖的四種方式詳解
本篇文章主要介紹了ASP.NET MVC從控制器傳遞數(shù)據(jù)到視圖的四種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01
如何使用Microsoft.Extensions.AI簡化.NET中的AI集成
Microsoft.Extensions.AI是一個創(chuàng)新的?.NET?庫,它為平臺開發(fā)人員提供了一個內(nèi)聚的?C#?抽象層,簡化了與大型語言模型(LLMs)和嵌入等AI服務的交互,本文給大家介紹如何使用Microsoft.Extensions.AI簡化.NET中的AI集成,感興趣的朋友一起看看吧2024-11-11

