這篇文章給大家分享的是有關(guān)C#中WebApi接口返回值有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司專注于安達(dá)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供安達(dá)營(yíng)銷型網(wǎng)站建設(shè),安達(dá)網(wǎng)站制作、安達(dá)網(wǎng)頁(yè)設(shè)計(jì)、安達(dá)網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造安達(dá)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供安達(dá)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
一、void無返回值
void關(guān)鍵字我們都不陌生,它申明方法沒有返回值。它的使用也很簡(jiǎn)單,我們來看一個(gè)示例就能明白。
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) { //處理業(yè)務(wù)邏輯 } }
在Web里面調(diào)用
$(function () { $.ajax({ type: 'post', url: 'http://localhost:21528/api/Order/SaveOrder', data: { ID: "aaa", NAME: "test" }, success: function (data, status) { alert(data); } }); });
得到結(jié)果
可以看到,使用void申明的方法,在success方法里面得不到返回值,并且會(huì)返回http狀態(tài)碼204,告訴客戶端此請(qǐng)求沒有返回值。
二、IHttpActionResult
IHttpActionResult類型是WebApi里面非常重要的一種返回值類型。下面博主就根據(jù)平時(shí)在項(xiàng)目里面使用最多的幾種方式來講解下這種類型的返回值的一些用法。
1、Json
使用MVC開發(fā)過的朋友一定記得,在MVC里面,請(qǐng)求數(shù)據(jù)的接口的返回值類型大部分使用的是JsonResult,在MVC里面你一定也寫過類似這樣的接口:
public JsonResult GetResult() { return Json(new { }, JsonRequestBehavior.AllowGet); }
那么,在WebAPI里面是否也存在類似的用法呢。呵呵,在這點(diǎn)上面,微軟總是貼心的。在WebApi的ApiController這個(gè)抽象類里面,為我們封裝了Json
[HttpGet] public IHttpActionResult GetOrder() { var lstRes = new List(); //實(shí)際項(xiàng)目中,通過后臺(tái)取到集合賦值給lstRes變量。這里只是測(cè)試。 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 >(lstRes); }
看到這個(gè)代碼,有人就疑惑了,我們定義的返回值類型是IHttpActionResult類型,直接返回Json
protected internal JsonResultJson (T content);
我們繼續(xù)將JsonResult
原來JsonResult
知道了這個(gè),我們直接在Web里面通過ajax請(qǐng)求來調(diào)用:
$(function () { $.ajax({ type: 'get', url: 'http://localhost:21528/api/Order/GetOrder', data: {}, success: function (data, status) { alert(data); } }); });
來看結(jié)果:
既然實(shí)體類可以直接這樣傳遞,那么如果我們想要傳遞一些匿名類型呢,因?yàn)楹芏嗲闆r下,我們需要返回到前端的對(duì)象都沒有對(duì)應(yīng)的實(shí)體來對(duì)應(yīng),如果我們想要返回匿名對(duì)象怎么辦呢?我們知道,這里的Json
[HttpGet] public IHttpActionResult GetOrder() { return Json(new { AA = "", BB = "cc" }); }
同樣的來看測(cè)試結(jié)果:
2、Ok()、Ok
除了Json
protected internal virtual OkResult Ok();
OkResult轉(zhuǎn)到定義
有了這個(gè)作為基礎(chǔ),我們就可以放心大膽的使用了。
[HttpGet] public IHttpActionResult GetOKResult() { return Ok(); }
得到結(jié)果
如果返回Ok(),就表示不向客戶端返回任何信息,只告訴客戶端請(qǐng)求成功。
除了Ok()之外,還有另外一個(gè)重載Ok
[HttpGet] public IHttpActionResult GetOKResult(string name) { return Ok(name); }
這種用法和Json
3、NotFound()
當(dāng)需要向客戶端返回找不到記錄時(shí),有時(shí)需要用到NotFound()方法。
protected internal virtual NotFoundResult NotFound();
來看看它的使用場(chǎng)景
[HttpGet] public IHttpActionResult GetNotFoundResult(string id) { var lstRes = new List(); //實(shí)際項(xiàng)目中,通過后臺(tái)取到集合賦值給lstRes變量。這里只是測(cè)試。 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 (oFind); } }
得到結(jié)果
NotFound()方法會(huì)返回一個(gè)404的錯(cuò)誤到客戶端。
4、其他
其他還有一些方法,都有它特定的用途。在此貼出來。
4.1、Content
[HttpGet] public IHttpActionResult GetContentResult() { return Content(HttpStatusCode.OK, "OK"); }
向客戶端返回值和http狀態(tài)碼。
4.2、BadRequest()
[HttpGet] public IHttpActionResult GetBadRequest(ORDER order) { if (string.IsNullOrEmpty(order.ID)) return BadRequest(); return Ok(); }
向客戶端返回400的http錯(cuò)誤。
4.3、Redirect(string location)
[HttpGet] public IHttpActionResult RedirectResult() { return Redirect("http://localhost:21528/api/Order/GetContentResult"); }
將請(qǐng)求重定向到其他地方。
5、自定義IHttpActionResult接口的實(shí)現(xiàn)
上面介紹了一些系統(tǒng)內(nèi)置的常用的實(shí)現(xiàn)IHttpActionResult接口的方法。如果我們需要自定義IHttpActionResult的返回呢?
在介紹之前,我們有必要先來看看IHttpActionResult類型的定義,將IHttpActionResult轉(zhuǎn)到定義可以看到:
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. // // 參數(shù): // cancellationToken: // The token to monitor for cancellation requests. // // 返回結(jié)果: // A task that, when completed, contains the System.Net.Http.HttpResponseMessage. TaskExecuteAsync(CancellationToken cancellationToken); } }
這個(gè)接口包含唯一的一個(gè)方法ExecuteAsync(),此方法將以異步方式創(chuàng)建一個(gè)HttpResponseMessage實(shí)例返回給客戶端。
有了這個(gè)作為基礎(chǔ),下面,我們自定義一個(gè)bootstrapTable服務(wù)端分頁(yè)的子類去展示自定義IHttpActionResult的用法。
首先,自定義一個(gè)實(shí)現(xiàn)類
public class PageResult : IHttpActionResult { object _value; HttpRequestMessage _request; public PageResult(object value, HttpRequestMessage request) { _value = value; _request = request; } public TaskExecuteAsync(System.Threading.CancellationToken cancellationToken) { var response = new HttpResponseMessage() { Content = new ObjectContent(typeof(object), _value, new JsonMediaTypeFormatter()), RequestMessage = _request }; return Task.FromResult(response); } }
然后,在API接口里面返回PageResult對(duì)象
[HttpGet] public IHttpActionResult GetPageRow(int limit, int offset) { var lstRes = new List(); //實(shí)際項(xiàng)目中,通過后臺(tái)取到集合賦值給lstRes變量。這里只是測(cè)試。 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 oData = new { total = lstRes.Count, rows = lstRes.Skip(offset).Take(limit).ToList() }; return new PageResult(oData, Request); }
最好,ajax調(diào)用
$(function () { $.ajax({ type: 'get', url: 'http://localhost:21528/api/Order/GetPageRow', data: { limit:1,offset:1}, success: function (data, status) { alert(data); } }); });
得到結(jié)果
三、HttpResponseMessage
在上文自定義IHttpActionResult返回類型的時(shí)候,提到過HttpResponseMessage這個(gè)對(duì)象。它表示向客戶端返回一個(gè)http響應(yīng)的消息對(duì)象(包含http狀態(tài)碼和需要返回客戶端的消息)。這個(gè)對(duì)象也有它獨(dú)特的使用場(chǎng)景:需要向客戶端返回HttpResponse時(shí)就要用到這個(gè)對(duì)象。以導(dǎo)出為例,由于需要將導(dǎo)出的Excel文件輸出到客戶端瀏覽器,Webapi的服務(wù)端需要向Web的客戶端輸出文件流,這個(gè)時(shí)候一般的IHttpActionResult對(duì)象不方便解決這個(gè)問題,于是HttpReponseMessage派上了用場(chǎng)。我們來看看它的使用示例。
public HttpResponseMessage Export() { //取數(shù)據(jù) var lstRes = OrderBLL.Export(); //向Excel里面填充數(shù)據(jù) HSSFWorkbook workbook = new HSSFWorkbook(); CreateAndFillSheet(workbook, lstRes); //保存到服務(wù) var fileName = "Excel" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; var strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Data\" + fileName); using (FileStream fs = new FileStream(strPath, FileMode.Create)) { workbook.Write(fs); using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); } } //輸出到瀏覽器 try { var stream = new FileStream(strPath, FileMode.Open); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StreamContent(stream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName }; return response; } catch { return new HttpResponseMessage(HttpStatusCode.NoContent); } }
將文件流保存在StreamContent對(duì)象里面,然后輸出到瀏覽器。在瀏覽器端即可將Excel輸出。
四、自定義類型
以上幾種返回值類型能解決我們大部分返回值的問題,當(dāng)然,你也可以將webapi的接口和普通方法一樣,返回任意的類型,WebApi會(huì)自動(dòng)序列化你自定義任何返回類型,然后將序列化的值寫到響應(yīng)正文里,狀態(tài)碼統(tǒng)一返回200。比如:
[HttpGet] public object GetOther() { var lstRes = new List(); //實(shí)際項(xiàng)目中,通過后臺(tái)取到集合賦值給lstRes變量。這里只是測(cè)試。 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 lstRes; }
得到結(jié)果
和上面的Json、Ok等用法在效果上面沒有太大區(qū)別。
感謝各位的閱讀!關(guān)于“C#中WebApi接口返回值有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!