Web API中的返回值类型

时间:2021-12-28 10:32:33

  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;
}

参考文献:

1.http://www.cnblogs.com/landeanfen/p/5501487.html

2.https://www.asp.net/web-api

3.https://blog.csdn.net/lwpoor123/article/details/78644998