WebApi接⼝返回值类型详解(转)
使⽤过Webapi的园友应该都知道,Webapi的接⼝返回值主要有四种类型
void⽆返回值
IHttpActionResult
HttpResponseMessage
⾃定义类型
此篇就围绕这四块分别来看看它们的使⽤。
⼀、void⽆返回值
void关键字我们都不陌⽣,它申明⽅法没有返回值。它的使⽤也很简单,我们来看⼀个⽰例就能明⽩。
  public class ORDER
{
public string ID { get; set; }
public string NO { get; set; }
public string NAME { get; set; }
public string DESC { get; set; }
}
  public class OrderController : ApiController
{
[HttpPost]
public void SaveOrder(ORDER name)
{
//处理业务逻辑
}
}
在Web⾥⾯调⽤
$(function () {
$.ajax({
type: 'post',
url: 'localhost:21528/api/Order/SaveOrder',
data: { ID: "aaa", NAME: "test" },
success: function (data, status) {
alert(data);
}
});
});
得到结果
可以看到,使⽤void申明的⽅法,在success⽅法⾥⾯得不到返回值,并且会返回http状态码204,告诉客户端此请求没有返回值。
⼆、IHttpActionResult
IHttpActionResult类型是WebApi⾥⾯⾮常重要的⼀种返回值类型。下⾯博主就根据平时在项⽬⾥⾯使⽤最多的⼏种⽅式来讲解下这种类型的返回值的⼀些⽤法。
1、Json<T>(T content)
使⽤MVC开发过的朋友⼀定记得,在MVC⾥⾯,请求数据的接⼝的返回值类型⼤部分使⽤的是JsonResult,在MVC⾥⾯你⼀定也写过类似这样的接⼝:
    public JsonResult GetResult()
{
return Json(new { }, JsonRequestBehavior.AllowGet);
}
那么,在WebAPI⾥⾯是否也存在类似的⽤法呢。呵呵,在这点上⾯,微软总是贴⼼的。在WebApi的ApiController这个抽象类⾥⾯,为我们封装了Json<T>(T content)这个⽅法,它的⽤法和MVC⾥⾯的JsonResult基本类似。我们通过⼀个例⼦来说明它的⽤法:
    [HttpGet]
public IHttpActionResult GetOrder()
{
var lstRes = new List<ORDER>();
//实际项⽬中,通过后台取到集合赋值给lstRes变量。这⾥只是测试。
lstRes.Add(new ORDER() { ID = "aaaa", NO = "111", NAME = "111", DESC = "1111" });
lstRes.Add(new ORDER() { ID = "bbbb", NO = "222", NAME = "222", DESC = "2222" });
return Json<List<ORDER>>(lstRes);
}
看到这个代码,有⼈就疑惑了,我们定义的返回值类型是IHttpActionResult类型,直接返回Json<T>(T content)这样可⾏么?我们将Json转到定义看看:
protected internal JsonResult<T> Json<T>(T content);
我们继续将JsonResult<T>转到定义
原来JsonResult<T>是实现了IHttpActionResult接⼝的,难怪可以直接返回呢。
知道了这个,我们直接在Web⾥⾯通过ajax请求来调⽤:
$(function () {
$.ajax({
type: 'get',
url: 'localhost:21528/api/Order/GetOrder',
data: {},
success: function (data, status) {
alert(data);
}
});
});
来看结果:
既然实体类可以直接这样传递,那么如果我们想要传递⼀些匿名类型呢,因为很多情况下,我们需要返回到前端的对象都没有对应的实体来对应,如果我们想要返回匿名对象怎么办呢?我们知道,这⾥的Json<T>(T content)必须要传⼀个对应的泛型类型,如果是匿名类型这⾥肯定不好传。还好有我们的object类型,当然你可以使⽤dynamic,我们来试⼀把。
[HttpGet]
public IHttpActionResult GetOrder()
{
return Json<dynamic>(new { AA = "", BB = "cc" });
}
同样的来看测试结果:
json值的类型有哪些
除了Json<T>(T content),在ApiController⾥⾯还有另外⼀个⽐较常⽤的⽅法:Ok()。同样,我们将Ok()转到定义
protected internal virtual OkResult Ok();
OkResult转到定义
有了这个作为基础,我们就可以放⼼⼤胆的使⽤了。
[HttpGet]
public IHttpActionResult GetOKResult()
{
return Ok();
}
得到结果
如果返回Ok(),就表⽰不向客户端返回任何信息,只告诉客户端请求成功。
除了Ok()之外,还有另外⼀个重载Ok<T>(T content)。
[HttpGet]
public IHttpActionResult GetOKResult(string name)
{
return Ok<string>(name);
}
这种⽤法和Json<T>(T content)⽐较类似,如果你⾮要问这两者有什么区别,或者说怎么选择两者。那么我的理解是如果是返回实体或者实体集合,建议使⽤Json<T>(T content),如果是返回基础类型(如int、string等),使⽤Ok<T>(T content)。
3、NotFound()
当需要向客户端返回不到记录时,有时需要⽤到NotFound()⽅法。
protected internal virtual NotFoundResult NotFound();
来看看它的使⽤场景
[HttpGet]
public IHttpActionResult GetNotFoundResult(string id)
{
var lstRes = new List<ORDER>();
//实际项⽬中,通过后台取到集合赋值给lstRes变量。这⾥只是测试。
lstRes.Add(new ORDER() { ID = "aaaa", NO = "111", NAME = "111", DESC = "1111" });            lstRes.Add(new ORDER() { ID = "bbbb", NO = "222", NAME = "222", DESC = "2222" });            var oFind = lstRes.FirstOrDefault(x => x.ID == id) ;
if (oFind == null)
{
return NotFound();
}
else
{
return Json<ORDER>(oFind);
}
}
$(function () {
$.ajax({
type: 'get',
url: 'localhost:21528/api/Order/GetNotFoundResult',
data: { id :"cccc" },
success: function (data, status) {
alert(data);
}
});
});
得到结果
NotFound()⽅法会返回⼀个404的错误到客户端。
4、其他
其他还有⼀些⽅法,都有它特定的⽤途。在此贴出来。
[HttpGet]
public IHttpActionResult GetContentResult()
{
return Content<string>(HttpStatusCode.OK, "OK");
}
向客户端返回值和http状态码。
[HttpGet]
public IHttpActionResult GetBadRequest(ORDER order)
{
if (string.IsNullOrEmpty(order.ID))
return BadRequest();
return Ok();
}
向客户端返回400的http错误。
[HttpGet]
public IHttpActionResult RedirectResult()
{
return Redirect("localhost:21528/api/Order/GetContentResult");
}
将请求重定向到其他地⽅。
5、⾃定义IHttpActionResult接⼝的实现上⾯介绍了⼀些系统内置的常⽤的实现IHttpActionResult接⼝的⽅法。如果我们需要⾃定义IHttpActionResult的返回呢?
在介绍之前,我们有必要先来看看IHttpActionResult类型的定义,将IHttpActionResult转到定义可以看到:namespace System.Web.Http
{
// 摘要:
//    Defines a command that asynchronously creates an System.Net.Http.HttpResponseMessage.
public interface IHttpActionResult
{
// 摘要:
//    Creates an System.Net.Http.HttpResponseMessage asynchronously.
//
// 参数:
//  cancellationToken:
//    The token to monitor for cancellation requests.
//
// 返回结果:
/
/    A task that, when completed, contains the System.Net.Http.HttpResponseMessage.
Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
}
这个接⼝包含唯⼀的⼀个⽅法ExecuteAsync(),此⽅法将以异步⽅式创建⼀个HttpResponseMessage实例返回给客户端。有了这个作为基础,下⾯,我们⾃定义⼀个bootstrapTable服务端分页的⼦类去展⽰⾃定义IHttpActionResult的⽤法。
⾸先,⾃定义⼀个实现类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。