WEBAPI action返回类型
转载
https://blog.csdn.net/Fang_Yanchang/article/details/109377636?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242.1
void Return empty 204 (No Content) 返回无内容
HttpResponseMessage Convert directly to an HTTP response message.直接转换为一个Http Reponse消息。
IHttpActionResult Call ExecuteAsync to create an HttpResponseMessage, then convert to an HTTP response message. 调用ExecuteAsync先创建一个HttpReponseMessage,在转换为Http Reponse输出。
其它类型 Write the serialized return value into the response body; return 200 (OK). 序列化后的信息返回到消息体中。
void无返回值 使用void关键字申明方法没有返回值。它的使用也很简单,我们来看一个示例。 public class ORDER { public string ID { get; set; } public string NO { get; set; } public string NAME { get; set; } } public class OrderController : ApiController { [HttpPost] public void SaveOrder(ORDER name) { //处理业务逻辑 } } $(function () { $.ajax({ type: 'post', url: 'http://localhost:21528/api/Order/SaveOrder', data: { ID: "aaa", NAME: "test" }, success: function (data, status) { alert(data); } }); }); 在success方法里面得不到返回值,并且会返回http状态码204,告诉客户端此请求没有返回值。
IHttpActionResult
on<T>(T content) 在WebApi的ApiController这个抽象类里面,为我们封装了Json<T>(T content)这个方法,它的用法和MVC里面的JsonResult基本类似。我们通过一个例子来说明它的用法: [HttpGet] public IHttpActionResult GetOrder() { var lstRes = new List<ORDER>(); lstRes.Add(new ORDER() { ID = "aaaa", NO = "111", NAME = "111" }); lstRes.Add(new ORDER() { ID = "bbbb", NO = "222", NAME = "222" }); return Json (lstRes); } Json( )方法的返回类型JsonResult<T>,实现了IHttpActionResult接口。 使用Ajax请求来调用该方法。 $(function () { $.ajax({ type: 'get', url: 'http://localhost:21528/api/Order/GetOrder', data: {}, success: function (data, status) { alert(data); } }); });
Ok()、 Ok<T>(T content) Ok( )方法的定义如下: protected internal virtual OkResult Ok(); 例如: [HttpGet] public IHttpActionResult GetOKResult() { return Ok(); }
如果返回Ok(),就表示不向客户端返回任何信息,只告诉客户端请求成功。
除了Ok()之外,还有另外一个重载Ok<T>(T content)。如下:
[HttpGet]
public IHttpActionResult GetOKResult(string name)
{
return Ok<string>(name);
}
Content<T>() [HttpGet] public IHttpActionResult GetContentResult() { return Content<string>(HttpStatusCode.OK, "OK"); } 向客户端返回值和http状态码。
BadRequest() [HttpGet] public IHttpActionResult GetBadRequest(ORDER order) { if (string.IsNullOrEmpty(order.ID)) return BadRequest(); return Ok(); } 向客户端返回400的http错误。
Redirect(string location) [HttpGet] public IHttpActionResult RedirectResult() { return Redirect("http://localhost:21528/api/Order/GetContentResult"); } 将请求重定向到其他地方。
自定义IHttpActionResult 上面介绍了一些系统内置的常用的实现IHttpActionResult接口的方法。如果我们需要自定义IHttpActionResult的返回呢? 在介绍之前,我们有必要先来看看IHttpActionResult类型的定义,将IHttpActionResult转到定义可以看到: namespace System.Web.Http { public interface IHttpActionResult { Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); } } 这个接口包含唯一的一个方法ExecuteAsync(),此方法将以异步方式创建一个HttpResponseMessage实例返回给客户端。 有了这个作为基础,下面,我们自定义一个bootstrapTable服务端分页的子类去展示自定义IHttpActionResult的用法。 首先,自定义一个实现类。 public class PageResult : IHttpActionResult { object _value; HttpRequestMessage _request; public PageResult(object value, HttpRequestMessage request) { _value = value; _request = request; } public Task<HttpResponseMessage> ExecuteAsync(System.Threading.CancellationToken cancellationToken) { var response = new HttpResponseMessage() { Content = new ObjectContent(typeof(object), _value, new JsonMediaTypeFormatter()), RequestMessage = _request }; return Task.FromResult(response); } } 然后,在API接口里面返回PageResult对象。 [HttpGet] public IHttpActionResult GetPageRow(int limit, int offset) { var lstRes = new List<ORDER>(); lstRes.Add(new ORDER() { ID = "aaaa", NO = "111", NAME = "111" }); lstRes.Add(new ORDER() { ID = "bbbb", NO = "222", NAME = "222" }); var oData = new { total = lstRes.Count, rows = lstRes.Skip(offset).Take(limit).ToList() }; return new PageResult(oData, Request); }
自定义类型 以上几种返回值类型能解决我们大部分返回值的问题,当然,你也可以将webapi的接口和普通方法一样,返回任意的类型,WebApi会自动序列化你自定义任何返回类型,然后将序列化的值写到响应正文里,状态码统一返回200。比如: [HttpGet] public object GetOther() { var lstRes = new List<ORDER>(); lstRes.Add(new ORDER() { ID = "aaaa", NO = "111", NAME = "111"}); lstRes.Add(new ORDER() { ID = "bbbb", NO = "222", NAME = "222"}); return lstRes; }