zoukankan      html  css  js  c++  java
  • Web API中的返回值类型

      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

  • 相关阅读:
    tomcat配置http、https同时访问
    mycat 多库分表 单库分表(根据uuid)
    分页关联查询时 出现查出数据和条数不匹配 级联查询
    微信公众号转发网页
    maven导出jar包
    sqlserver分割字符
    mysql按字符分割字段排序
    对ajax中数据的得到以及绑定的认识
    对待事情应该有的态度!!!
    对Dom的认识
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9489377.html
Copyright © 2011-2022 走看看