WebApi中的返回值类型大致可分为四种: Void/ IHttpActionResult/ HttpResponseMessage /自定义类型
一、Void
void申明方法没有返回值,执行成功后返回204状态码。使用起来十分简单:
public class NewsController : ApiController { [HttpPost] public void AddNews(News news) { } }
前端Ajax请求代码:
$(function () { $.ajax({ type: 'post', url: 'http://localhost:60761/api/News', data: { Id: 1, Title: "新闻1", Desc: '这是第一条新闻' }, success: function (data) { alert(data); } }) })
二、IHttpActionResult
2.1 json
和MVC一样,Web API中的IHttpActionResult也提过Json方法来返回JsonReuslt类型。
List<News> newsList = new List<News> { new News{Id=1,Title="新闻1",Desc="这是新闻1"}, new News{Id=2,Title="新闻2",Desc="这是新闻2"}, new News{Id=3,Title="新闻3",Desc="这是新闻3"}, }; [HttpGet] public IHttpActionResult GetUserList() { //Json<T>方法返回一个JsonResult,JsonResult是IHttpActionResult的实现类 return Json<List<News>>(newsList); }
前端ajax请求代码:
$(function () { $.ajax({ type: 'get', url:'http://localhost:60761/api/News', data: {}, success: function (data) { console.log(data) } }) });
Json方法也支持返回匿名类型,如下:
[HttpGet] public IHttpActionResult GetUserList() { //Json方法返回一个JsonResult,JsonResult是IHttpActionResult的实现类 var list = newsList.Where(n => n.Id > 1).Select(n => new { n.Title, n.Desc }); return Json(list); }
2.2 Ok和NotFound
Ok()和Ok(T content)返回一个OkResult实例,OkResult是IHttpActionResult的实现类
2.2.1 Ok返回简单类型
[HttpGet] public IHttpActionResult GetUserList() { //Ok<T>方法返回一个OkResult,OkResult是IHttpActionResult的实现类 return Ok<string>("成功了!"); //return Ok<List<News>>(newsList); }
前端ajax请求代码:
$(function () { $.ajax({ type: 'get', url:'http://localhost:60761/api/News', data: {}, success: function (data) { console.log(data) } }) });
2.2.2 Ok返回复杂类型
List<News> newsList = new List<News> { new News{Id=1,Title="新闻1",Desc="这是新闻1"}, new News{Id=2,Title="新闻2",Desc="这是新闻2"}, new News{Id=3,Title="新闻3",Desc="这是新闻3"}, }; [HttpGet] public IHttpActionResult GetNewsList() { //Ok<T>方法返回一个OkResult,OkResult是IHttpActionResult的实现类 //return Ok<string>("成功了!"); return Ok<List<News>>(newsList); }
2.2.3 NotFound 返回404
List<News> newsList = new List<News> { new News{Id=1,Title="新闻1",Desc="这是新闻1"}, new News{Id=2,Title="新闻2",Desc="这是新闻2"}, new News{Id=3,Title="新闻3",Desc="这是新闻3"}, }; public IHttpActionResult GetNewsListById(int id) { //NotFound方法返回一个NotFoundResult实例, //NotFoundResult实现了IHttpActionResult接口,返回404 News news = newsList.Where(n => n.Id == id).SingleOrDefault(); if (news==null) { return NotFound(); } else { return Json<News>(news); }
前端ajax请求:
$(function () { $.ajax({ type: 'get', url:'http://localhost:60761/api/News', data: {id:4}, success: function (data) { console.log(data) } }) });
2.3 其他类型
IHttpActionResult的实现类还有几种,使用起来也十分简单,列举如下:
2.3.1 Content
public IHttpActionResult Get() { return Content<string>(HttpStatusCode.OK, "成功了!"); }
2.3.2 BadRequest
public IHttpActionResult Get() { return BadRequest("错误请求!"); }
2.3.3 Redirect(string)
public IHttpActionResult Get() { return Redirect("http://localhost:60761/api/News/Welcome"); } [Route("api/News/Welcome")] [HttpGet] public IHttpActionResult RedirectHere() { return Content(HttpStatusCode.OK, "跳转成功!"); }
2.4 自定义类型(IHttpActionResult的实现类)
IHttpActionResult只有一个接口方法: ExecuteAsync ,这个方法的作用就是 异步地返回HttpResponseMessage 。一个返回分页结果的栗子:
//分页结果类实现IHttpActionResult public class PageResult : IHttpActionResult { object _value; HttpRequestMessage _request; public PageResult(object value,HttpRequestMessage request) { _value = value; _request = request; } //只有这一个接口方法 public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { var response = new HttpResponseMessage() { Content = new ObjectContent(typeof(object), _value, new JsonMediaTypeFormatter()), StatusCode = HttpStatusCode.OK, ReasonPhrase = "服务器留言内容", RequestMessage=_request }; return Task.FromResult(response); } } List<News> newsList = new List<News> { new News{Id=1,Title="新闻1",Desc="这是新闻1"}, new News{Id=2,Title="新闻2",Desc="这是新闻2"}, new News{Id=3,Title="新闻3",Desc="这是新闻3"}, }; //在Action中返回分页结果类型 public IHttpActionResult Get(int offset,int limit) { var result = newsList.Skip(offset).Take(limit); return new PageResult(result, Request); }
前端ajax调用:
$(function () { $.ajax({ type: 'get', url:'http://localhost:60761/api/News', data: {offset:1,limit:2}, success: function (data) { console.log(data) } }) });
三、HttpResponseMessage
我们可以直接返回HttpResponseMessage,通常使用 request.CreateResponse 方法生成一个HttpResponseMessage对象。
public HttpResponseMessage Get(int offset,int limit) { var result = newsList.Skip(offset).Take(limit); return Request.CreateResponse(HttpStatusCode.OK, newsList, "application/json"); }
四、其他类型
我们也可以像写普通方法返回List,string,Array...等类型,WebAPI在管道事件会使用媒体格式化器(Media-type formmater)这些类型自动序列化,如我们返回一个List集合:
public List<News> Get(int offset,int limit) { var result = newsList.Skip(offset).Take(limit); return newsList; }
参考文献: