正文
作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值。还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看。
使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型
- void无返回值
- IHttpActionResult
- HttpResponseMessage
- 自定义类型
此篇就围绕这四块分别来看看它们的使用。
一:viod无返回值
void关键字我们都不陌生,它申明方法没有返回值。它的使用也很简单,我们来看一个示例就能明白。
![3f596801aaf7d21ff2de315523c5c6c7.png](https://i-blog.csdnimg.cn/blog_migrate/d35d80dec20fdd5f55404e3e024052cf.jpeg)
![ce5abcecaec5f569f63b5e6ba7761949.png](https://i-blog.csdnimg.cn/blog_migrate/7d9f6b70387add7a5cafac63481c9064.jpeg)
在Web里面调用
![89f86541bcc91504546e184e2d71dcec.png](https://i-blog.csdnimg.cn/blog_migrate/cde99d85104d132c702c2f563654bbbc.jpeg)
得到结果
![ffd86e7e1a42efdb1d46906c4125fd2d.gif](https://i-blog.csdnimg.cn/blog_migrate/07faf7a1c544bf6ee9f651265da70b2c.gif)
可以看到,使用void申明的方法,在success方法里面得不到返回值,并且会返回http状态码204,告诉客户端此请求没有返回值。
二、IHttpActionResult
IHttpActionResult类型是WebApi里面非常重要的一种返回值类型。下面博主就根据平时在项目里面使用最多的几种方式来讲解下这种类型的返回值的一些用法。
1、Json(T content)
使用MVC开发过的朋友一定记得,在MVC里面,请求数据的接口的返回值类型大部分使用的是JsonResult,在MVC里面你一定也写过类似这样的接口:
![a045cce2d600885109253f8c442319c3.png](https://i-blog.csdnimg.cn/blog_migrate/1c0a4fcab46412c2b123dc4b4c158361.jpeg)
那么,在WebAPI里面是否也存在类似的用法呢。呵呵,在这点上面,微软总是贴心的。在WebApi的ApiController这个抽象类里面,为我们封装了Json(T content)这个方法,它的用法和MVC里面的JsonResult基本类似。我们通过一个例子来说明它的用法:
![d35a649d58fe0e0bf1710e2c9d64f81a.png](https://i-blog.csdnimg.cn/blog_migrate/b14e8b868a9b61609a4a95fa933d7b2c.jpeg)
看到这个代码,有人就疑惑了,我们定义的返回值类型是IHttpActionResult类型,直接返回Json(T content)这样可行么?我们将Json转到定义看看:
![0bf1059df19924a7fc661eeb2d01cbe4.png](https://i-blog.csdnimg.cn/blog_migrate/381d244eeb6a78f44d014320c0907b2b.jpeg)
我们继续将JsonResult转到定义
![a5f338de429ee637a8fce655ce81a521.png](https://i-blog.csdnimg.cn/blog_migrate/b082d86e75c1aaab4f8b8937cf11d124.jpeg)
原来JsonResult是实现了IHttpActionResult接口的,难怪可以直接返回呢。
知道了这个,我们直接在Web里面通过ajax请求来调用:
![bbfca227ce932f5afddaec3cdafd89d0.png](https://i-blog.csdnimg.cn/blog_migrate/4f5627428d17aa8d1df4a135d049c0a6.jpeg)
来看结果:
![2af520dc37dfcc63e2cbfe5a388f1062.gif](https://i-blog.csdnimg.cn/blog_migrate/c3bf1efdaef1f37096bbdc5637884bbe.gif)
既然实体类可以直接这样传递,那么如果我们想要传递一些匿名类型呢,因为很多情况下,我们需要返回到前端的对象都没有对应的实体来对应,如果我们想要返回匿名对象怎么办呢?我们知道,这里的Json(T content)必须要传一个对应的泛型类型,如果是匿名类型这里肯定不好传。还好有我们的object类型,当然你可以使用dynamic,我们来试一把。
![a72ba5d390e1783967c5a7d46521a8d0.png](https://i-blog.csdnimg.cn/blog_migrate/58f1a1e3560c0d0c671feebf507c340d.jpeg)
同样的来看测试结果:
![e3cbb658e06dbc3e7b13e9ec0d06ebb0.gif](https://i-blog.csdnimg.cn/blog_migrate/8a7af01af6a92b796761af08a079af8c.gif)
2、Ok()、 Ok(T content)
除了Json(T content),在ApiController里面还有另外一个比较常用的方法:Ok()。同样,我们将Ok()转到定义
protected internal virtual OkResult Ok();
OkResult转到定义
![e6d16b924a176246cd394f60dbf436b2.png](https://i-blog.csdnimg.cn/blog_migrate/9fcb34bbadf6add0ba0ded0aa150f3fe.jpeg)
有了这个作为基础,我们就可以放心大胆的使用了。
![dae129da1f616daaddf3e1ab95d7b4f6.png](https://i-blog.csdnimg.cn/blog_migrate/ebe5cd7222fc163af4fef9281650a6f3.jpeg)
得到结果
![a9de8f944228b3f5c497c22e8feb5dec.gif](https://i-blog.csdnimg.cn/blog_migrate/0c181c2b4c21a234b6f99f041d3de729.gif)
如果返回Ok(),就表示不向客户端返回任何信息,只告诉客户端请求成功。
除了Ok()之外,还有另外一个重载Ok(T content)。
![6051ee349580064acebe0f5d77f3e16c.png](https://i-blog.csdnimg.cn/blog_migrate/4a3ad1690f1c40c2bb309cf499f4580f.jpeg)
![8d25edc93edc23d27f4baf0e1e236fa7.gif](https://i-blog.csdnimg.cn/blog_migrate/cb2c02b19101ed212d357210e6d36da2.gif)
这种用法和Json(T content)比较类似,如果你非要问这两者有什么区别,或者说怎么选择两者。那么我的理解是如果是返回实体或者实体集合,建议使用Json(T content),如果是返回基础类型(如int、string等),使用Ok(T content)。
3、NotFound()
当需要向客户端返回找不到记录时,有时需要用到NotFound()方法。
![3239ffb5e1955ffe604856056bb96808.png](https://i-blog.csdnimg.cn/blog_migrate/489f8f5f33990cb618fbb150544108a8.jpeg)
![b451322e9f62c0e4d68f287a9c03a95b.png](https://i-blog.csdnimg.cn/blog_migrate/49377b318c98c7feb42b3111987cf396.jpeg)
来看看它的使用场景
![a3f9c3d06df6b5918f90fb798481c006.png](https://i-blog.csdnimg.cn/blog_migrate/a7f98193ffce939c67fdb7e3b4891c26.jpeg)
![8772639955a75e53e3af2c305267dd5d.png](https://i-blog.csdnimg.cn/blog_migrate/77afdcc7a0af56948397ce5f0461d02d.jpeg)
得到结果
![22c6b7c5116b88bb859111f28d465963.gif](https://i-blog.csdnimg.cn/blog_migrate/7748c3519488fa4d6e4cc8bea6ff18d9.gif)
NotFound()方法会返回一个404的错误到客户端。
4、其他
其他还有一些方法,都有它特定的用途。在此贴出来。
4.1、Content(HttpStatusCode statusCode, T value)
![3542086bf726d815b911cf9891a81ef2.png](https://i-blog.csdnimg.cn/blog_migrate/6c845d5a1e0370d9306e54ecbdc77d17.jpeg)
向客户端返回值和http状态码。
4.2、BadRequest()
![63707a21eb1fe7f339d526af6de37cca.png](https://i-blog.csdnimg.cn/blog_migrate/675d3300bb14f92f7791372853877820.jpeg)
向客户端返回400的http错误。
4.3、Redirect(string location)
![b16002496c79bf172e4371d8dbb81f93.png](https://i-blog.csdnimg.cn/blog_migrate/db3d6b15bfe7b729ca8406506f1bc735.jpeg)
将请求重定向到其他地方。
5、自定义IHttpActionResult接口的实现
上面介绍了一些系统内置的常用的实现IHttpActionResult接口的方法。如果我们需要自定义IHttpActionResult的返回呢?
在介绍之前,我们有必要先来看看IHttpActionResult类型的定义,将IHttpActionResult转到定义可以看到:
![e55e6e23e4f77637fb35daa4097950da.png](https://i-blog.csdnimg.cn/blog_migrate/575602eeea563a60f941b86224e438d3.jpeg)
这个接口包含唯一的一个方法ExecuteAsync(),此方法将以异步方式创建一个HttpResponseMessage实例返回给客户端。
有了这个作为基础,下面,我们自定义一个bootstrapTable服务端分页的子类去展示自定义IHttpActionResult的用法。
首先,自定义一个实现类
![7002d76c8b0f727c2de205b25d6cd602.png](https://i-blog.csdnimg.cn/blog_migrate/ab88657752268ff6d703b46be607c6e2.jpeg)
然后,在API接口里面返回PageResult对象
![e671cad9b9a5fa3b6f7ec5db2b206908.png](https://i-blog.csdnimg.cn/blog_migrate/f76730f61630ab238b254c9cc4dc1c81.jpeg)
最好,ajax调用
![4fd3072b5cd57b71ec09292ca8f6a546.png](https://i-blog.csdnimg.cn/blog_migrate/ea526b06a6d5b60eae73818265e0a766.jpeg)
得到结果
![7083c728703346eb88cddfc71f653a6a.gif](https://i-blog.csdnimg.cn/blog_migrate/0cc1e074e04d7e8dd3eb46dea3561549.gif)
三、HttpResponseMessage
在上文自定义IHttpActionResult返回类型的时候,提到过HttpResponseMessage这个对象。它表示向客户端返回一个http响应的消息对象(包含http状态码和需要返回客户端的消息)。这个对象也有它独特的使用场景:需要向客户端返回HttpResponse时就要用到这个对象。以导出为例,由于需要将导出的Excel文件输出到客户端浏览器,Webapi的服务端需要向Web的客户端输出文件流,这个时候一般的IHttpActionResult对象不方便解决这个问题,于是HttpReponseMessage派上了用场。我们来看看它的使用示例。
![94c82340b297840e305941431239c00e.png](https://i-blog.csdnimg.cn/blog_migrate/2e94db034c9ee6ece05954bafbad20da.jpeg)
将文件流保存在StreamContent对象里面,然后输出到浏览器。在浏览器端即可将Excel输出。
四、自定义类型
以上几种返回值类型能解决我们大部分返回值的问题,当然,你也可以将webapi的接口和普通方法一样,返回任意的类型,WebApi会自动序列化你自定义任何返回类型,然后将序列化的值写到响应正文里,状态码统一返回200。比如:
![025eb80d74f60f2460a0ec2ed7e2191f.png](https://i-blog.csdnimg.cn/blog_migrate/0977a05d383d6bcf7c80fe79b151cf51.jpeg)
得到结果
![5c5ba4303c4dbdea50de7fb06238e76b.gif](https://i-blog.csdnimg.cn/blog_migrate/da7e02a8b6b3a3dcb543758674ee9020.gif)
和上面的Json、Ok等用法在效果上面没有太大区别。、
五、总结
以上通过四个方面详细分享了下WebApi里面返回值的常见用法,不能说哪种方式最好,因为每种方式都有其特定的使用场景。博主觉得为了规范WebApi接口,对于一般接口的返回值,尽量使用IHttpActionResult类型作为返回值,毕竟是微软内置的东西,可能为我们考虑了很多我们考虑不到的东西。
评论转发有惊喜哦~