如何在Web API中同时返回数据总数与XML格式数据?
问题:Web API中同时返回数据总数与业务数据(XML/JSON格式)
需求背景
需要在Web API接口中同时返回数据总条数和业务数据列表,之前尝试用if语句判断后单独返回总数,结果只能输出总数的XML(如<int>10</int>),无法同时展示业务数据。希望找到无需if语句的实现方式,同时支持类似示例的JSON和XML格式输出。
用户期望的JSON格式示例(修正原语法错误):
{ "Count": 2, "Data": [ { "userid": 1, "name": "emily", "mobile": "98724954", "Age": 24, "Date": "2020-10-04T21:05:00" }, { "userid": 2, "name": "peter", "mobile": "42896592", "Age": 35, "Date": "2021-05-25T11:20:00" } ] }
用户提供的错误代码与实体类
原错误接口代码(存在语法错误,if语句位于方法外部)
[HttpGet] public IHttpActionResult Get() { List<TestClass> draft = new List<TestClass>(); string mainconn = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString; SqlConnection sqlconn = new SqlConnection(mainconn); string sqlquery = "SELECT UserID, Name, Mobile, Age, Date From tbluser"; sqlconn.Open(); SqlCommand sqlcomm = new SqlCommand(sqlquery, sqlconn); SqlDataReader sdr = sqlcomm.ExecuteReader(); while (sdr.Read()) { draft.Add(new TestClass() { UserId = sdr.GetString(0), Name = sdr.GetString(1), Mobile = sdr.GetString(2), Age = sdr.GetInt32(3), Date = sdr.GetDateTime(4) }); } return Ok(draft); } // 以下代码语法错误,位于方法外部 if(test.Count>0) { return Ok(test.Count()); } else { return Ok("None"); };
实体类TestClass
public class TestClass { public string UserId { get; set; } public string Name { get; set; } public string Mobile { get; set; } public int Age { get; set; } public DateTime Date { get; set; } }
解决方案:统一返回包装类
核心思路是定义一个包装类,同时包含Count(总数)和Data(业务数据列表)两个属性,接口直接返回这个包装类的实例。ASP.NET Web API会自动根据请求头的Accept参数(application/json或application/xml)输出对应格式的结果,无需if语句分支。
步骤1:定义包装类ApiResult
public class ApiResult { // 数据总条数 public int Count { get; set; } // 业务数据列表 public List<TestClass> Data { get; set; } }
步骤2:修正接口代码(修复资源泄漏与变量错误)
[HttpGet] public IHttpActionResult Get() { List<TestClass> draft = new List<TestClass>(); string mainconn = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString; // 使用using自动释放数据库资源,避免连接泄漏 using (SqlConnection sqlconn = new SqlConnection(mainconn)) { string sqlquery = "SELECT UserID, Name, Mobile, Age, Date From tbluser"; sqlconn.Open(); using (SqlCommand sqlcomm = new SqlCommand(sqlquery, sqlconn)) { using (SqlDataReader sdr = sqlcomm.ExecuteReader()) { while (sdr.Read()) { draft.Add(new TestClass() { UserId = sdr.GetString(0), Name = sdr.GetString(1), Mobile = sdr.GetString(2), Age = sdr.GetInt32(3), Date = sdr.GetDateTime(4) }); } } } } // 组装返回结果 var apiResult = new ApiResult { Count = draft.Count, Data = draft }; // 返回包装类,Web API自动处理JSON/XML格式 return Ok(apiResult); }
步骤3:验证输出格式
- JSON格式(请求头
Accept: application/json):
{ "Count": 2, "Data": [ { "UserId": "1", "Name": "emily", "Mobile": "98724954", "Age": 24, "Date": "2020-10-04T21:05:00" }, { "UserId": "2", "Name": "peter", "Mobile": "42896592", "Age": 35, "Date": "2021-05-25T11:20:00" } ] }
- XML格式(请求头
Accept: application/xml):
<ApiResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/YourNamespace"> <Count>2</Count> <Data> <TestClass> <Age>24</Age> <Date>2020-10-04T21:05:00</Date> <Mobile>98724954</Mobile> <Name>emily</Name> <UserId>1</UserId> </TestClass> <TestClass> <Age>35</Age> <Date>2021-05-25T11:20:00</Date> <Mobile>42896592</Mobile> <Name>peter</Name> <UserId>2</UserId> </TestClass> </Data> </ApiResult>
关键注意事项
- 必须使用
using语句包裹数据库连接、命令、DataReader,避免资源泄漏。 - 原更新代码中的
api变量未定义,需替换为实际的业务数据列表draft。 - Web API默认支持JSON和XML格式,无需额外配置,只需通过请求头
Accept指定即可。
内容的提问来源于stack exchange,提问作者user19613128
相关产品推荐
相关产品推荐

