fscanf返回值被忽略怎么解决_C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解...

正文

作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值。还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看。

使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型

  • void无返回值
  • IHttpActionResult
  • HttpResponseMessage
  • 自定义类型

此篇就围绕这四块分别来看看它们的使用。

一:viod无返回值

void关键字我们都不陌生,它申明方法没有返回值。它的使用也很简单,我们来看一个示例就能明白。

3f596801aaf7d21ff2de315523c5c6c7.png
ce5abcecaec5f569f63b5e6ba7761949.png

在Web里面调用

89f86541bcc91504546e184e2d71dcec.png

得到结果

ffd86e7e1a42efdb1d46906c4125fd2d.gif

可以看到,使用void申明的方法,在success方法里面得不到返回值,并且会返回http状态码204,告诉客户端此请求没有返回值。

二、IHttpActionResult

IHttpActionResult类型是WebApi里面非常重要的一种返回值类型。下面博主就根据平时在项目里面使用最多的几种方式来讲解下这种类型的返回值的一些用法。

1、Json(T content)

使用MVC开发过的朋友一定记得,在MVC里面,请求数据的接口的返回值类型大部分使用的是JsonResult,在MVC里面你一定也写过类似这样的接口:

a045cce2d600885109253f8c442319c3.png

那么,在WebAPI里面是否也存在类似的用法呢。呵呵,在这点上面,微软总是贴心的。在WebApi的ApiController这个抽象类里面,为我们封装了Json(T content)这个方法,它的用法和MVC里面的JsonResult基本类似。我们通过一个例子来说明它的用法:

d35a649d58fe0e0bf1710e2c9d64f81a.png

看到这个代码,有人就疑惑了,我们定义的返回值类型是IHttpActionResult类型,直接返回Json(T content)这样可行么?我们将Json转到定义看看:

0bf1059df19924a7fc661eeb2d01cbe4.png

我们继续将JsonResult转到定义

a5f338de429ee637a8fce655ce81a521.png

原来JsonResult是实现了IHttpActionResult接口的,难怪可以直接返回呢。

知道了这个,我们直接在Web里面通过ajax请求来调用:

bbfca227ce932f5afddaec3cdafd89d0.png

来看结果:

2af520dc37dfcc63e2cbfe5a388f1062.gif

既然实体类可以直接这样传递,那么如果我们想要传递一些匿名类型呢,因为很多情况下,我们需要返回到前端的对象都没有对应的实体来对应,如果我们想要返回匿名对象怎么办呢?我们知道,这里的Json(T content)必须要传一个对应的泛型类型,如果是匿名类型这里肯定不好传。还好有我们的object类型,当然你可以使用dynamic,我们来试一把。

a72ba5d390e1783967c5a7d46521a8d0.png

同样的来看测试结果:

e3cbb658e06dbc3e7b13e9ec0d06ebb0.gif

2、Ok()、 Ok(T content)

除了Json(T content),在ApiController里面还有另外一个比较常用的方法:Ok()。同样,我们将Ok()转到定义

protected internal virtual OkResult Ok();

OkResult转到定义

e6d16b924a176246cd394f60dbf436b2.png

有了这个作为基础,我们就可以放心大胆的使用了。

dae129da1f616daaddf3e1ab95d7b4f6.png

得到结果

a9de8f944228b3f5c497c22e8feb5dec.gif

如果返回Ok(),就表示不向客户端返回任何信息,只告诉客户端请求成功。

除了Ok()之外,还有另外一个重载Ok(T content)。

6051ee349580064acebe0f5d77f3e16c.png
8d25edc93edc23d27f4baf0e1e236fa7.gif

这种用法和Json(T content)比较类似,如果你非要问这两者有什么区别,或者说怎么选择两者。那么我的理解是如果是返回实体或者实体集合,建议使用Json(T content),如果是返回基础类型(如int、string等),使用Ok(T content)。

3、NotFound()

当需要向客户端返回找不到记录时,有时需要用到NotFound()方法。

3239ffb5e1955ffe604856056bb96808.png
b451322e9f62c0e4d68f287a9c03a95b.png

来看看它的使用场景

a3f9c3d06df6b5918f90fb798481c006.png
8772639955a75e53e3af2c305267dd5d.png

得到结果

22c6b7c5116b88bb859111f28d465963.gif

NotFound()方法会返回一个404的错误到客户端。

4、其他

其他还有一些方法,都有它特定的用途。在此贴出来。

4.1、Content(HttpStatusCode statusCode, T value)

3542086bf726d815b911cf9891a81ef2.png

向客户端返回值和http状态码。

4.2、BadRequest()

63707a21eb1fe7f339d526af6de37cca.png

向客户端返回400的http错误。

4.3、Redirect(string location)

b16002496c79bf172e4371d8dbb81f93.png

将请求重定向到其他地方。

5、自定义IHttpActionResult接口的实现

上面介绍了一些系统内置的常用的实现IHttpActionResult接口的方法。如果我们需要自定义IHttpActionResult的返回呢?

在介绍之前,我们有必要先来看看IHttpActionResult类型的定义,将IHttpActionResult转到定义可以看到:

e55e6e23e4f77637fb35daa4097950da.png

这个接口包含唯一的一个方法ExecuteAsync(),此方法将以异步方式创建一个HttpResponseMessage实例返回给客户端。

有了这个作为基础,下面,我们自定义一个bootstrapTable服务端分页的子类去展示自定义IHttpActionResult的用法。

首先,自定义一个实现类

7002d76c8b0f727c2de205b25d6cd602.png

然后,在API接口里面返回PageResult对象

e671cad9b9a5fa3b6f7ec5db2b206908.png

最好,ajax调用

4fd3072b5cd57b71ec09292ca8f6a546.png

得到结果

7083c728703346eb88cddfc71f653a6a.gif

三、HttpResponseMessage

在上文自定义IHttpActionResult返回类型的时候,提到过HttpResponseMessage这个对象。它表示向客户端返回一个http响应的消息对象(包含http状态码和需要返回客户端的消息)。这个对象也有它独特的使用场景:需要向客户端返回HttpResponse时就要用到这个对象。以导出为例,由于需要将导出的Excel文件输出到客户端浏览器,Webapi的服务端需要向Web的客户端输出文件流,这个时候一般的IHttpActionResult对象不方便解决这个问题,于是HttpReponseMessage派上了用场。我们来看看它的使用示例。

94c82340b297840e305941431239c00e.png

将文件流保存在StreamContent对象里面,然后输出到浏览器。在浏览器端即可将Excel输出。

四、自定义类型

以上几种返回值类型能解决我们大部分返回值的问题,当然,你也可以将webapi的接口和普通方法一样,返回任意的类型,WebApi会自动序列化你自定义任何返回类型,然后将序列化的值写到响应正文里,状态码统一返回200。比如:

025eb80d74f60f2460a0ec2ed7e2191f.png

得到结果

5c5ba4303c4dbdea50de7fb06238e76b.gif

和上面的Json、Ok等用法在效果上面没有太大区别。、

五、总结

以上通过四个方面详细分享了下WebApi里面返回值的常见用法,不能说哪种方式最好,因为每种方式都有其特定的使用场景。博主觉得为了规范WebApi接口,对于一般接口的返回值,尽量使用IHttpActionResult类型作为返回值,毕竟是微软内置的东西,可能为我们考虑了很多我们考虑不到的东西

评论转发有惊喜哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值