C# WebApi之接口返回类型详解

转自:https://www.cnblogs.com/hnsongbiao/p/9375888.html

Webapi的接口返回值主要有四种类型

  1. void无返回值
  2. IHttpActionResult
  3. HttpResponseMessage
  4. 自定义类型

    void无返回值

    大家都知道void声明的是一个无返回值的方法,声明一个api控制器方法,例如:

public class ValuesController : ApiController
{
    [HttpGet]
    public void Get()
    {
        int a = 1;
        int b = 2;
        int c = a + b;
        //.....................
    }

    }

使用postman,测试接口:


可以看到,void声明的接口,在请求成功的时候得不到返回值,而且会返回http的状态码为204,表示没有返回值。

IHttpActionResult

IHttpActionResult是WebApi最常用的一种返回值类型,常用的方式有:Json(T content)、Ok()、 Ok(T content)、NotFound()、Content(HttpStatusCode statusCode, T value)、BadRequest()、Redirect(string location)等

Json(T content)

在WebApi的ApiController这个抽象类里面,为我们封装了Json(T content)这个方法,它的用法和MVC里面的JsonResult基本类似。

[HttpGet]
public IHttpActionResult getJson()
{
    var list = new List<userinfo>();
    list.Add(new userinfo { Name="jeck",age=22 });
    list.Add(new userinfo { Name = "poor", age = 23 });
    return Json<List<userinfo>>(list);
}

private class userinfo{
    public string Name { get; set; }
    public int age { get; set; }
}

测试结果: 

为什么可以返回 Json(T content)呢,转到Json(T content)的定义,发现它返回的是JsonResult对象 

再转到JsonResult的定义,发现它实现了IHttpActionResult接口 

当然也可以使用dynamic来返回一个对象

[HttpGet]
public IHttpActionResult getJson()
{
    return Json<dynamic>(new { AA = "a", BB = "b" });
}

Ok()、 Ok(T content)

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

[HttpGet]
public IHttpActionResult getJson()
{
    return Ok();
}

Ok(T content)向客户端返回一个成功的对象

[HttpGet]
public IHttpActionResult getJson1()
{
    string result = "请求成功!";
    return Ok(result);
}

NotFound()

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

[HttpGet]
public IHttpActionResult getJson()
{
    return NotFound();
}

Content(HttpStatusCode statusCode, T value)

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

[HttpGet]
public IHttpActionResult getJson()
{
    return Content<string>(HttpStatusCode.OK, "OK");
}

BadRequest()

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

[HttpGet]
public IHttpActionResult getJson2()
{
    return BadRequest();
}

Redirect(string location)

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

[HttpGet]
public IHttpActionResult getJson3()
{
    return Redirect("http://localhost:7408/api/Values/getJson1");
}
[HttpGet]
public IHttpActionResult getJson1()
{
    string result = "请求成功!";
    return Ok(result);
}

HttpResponseMessage

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

public HttpResponseMessage Export()
{
    //取数据
    var lstRes = OrderBLL.Export();

    //向Excel里面填充数据
    HSSFWorkbook workbook = new HSSFWorkbook();
    CreateAndFillSheet(workbook, lstRes);

    //保存到服务
    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);
    }
}

自定义类型

你也可以将webapi的接口和普通方法一样,返回任意的类型,WebApi会自动序列化你自定义任何返回类型,然后将序列化的值写到响应正文里,状态码统一返回200。

[HttpGet]
public object getJson()
{
    var list = new List<userinfo>();
    list.Add(new userinfo { Name = "work", age = 11 });
    list.Add(new userinfo { Name = "hard", age = 12 });
    return list;
}

原文地址:https://www.cnblogs.com/turnip/p/12335368.html

时间: 2024-10-13 06:37:09

C# WebApi之接口返回类型详解的相关文章

Java之协变返回类型详解(附源码)

前言 Java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型: 示例源码 package com.mufeng.theeighthchapter; class Grain { @Override public String toString() { // TODO Auto-generated method stub return "Grain"; } } class Wheat extends Grain { @Override p

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用. 一.void无返回值 void关键字我们都不陌生,它申明方法没有返回值.它的使用也很简单,我们来看一个示例就能明白. public class ORDER { publi

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult     (需要MVC高版本才会支持,VS2012/2013不支持,请升级DLL文件或者到VS2015开发环境) HttpResponseMessage 自定义类型 此篇就

Web Api 接口返回值不困惑:返回值类型详解

前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 WebApi 接口参数:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值.还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看. 使用过Webapi

赋值运算符函数的返回值类型详解

在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果: 1.当返回值为空时: <span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span> 这个时候如果只有一个'='(a = b)运算那就没问题,但是如果存在'='(a = b = c)的链式操作时,编译器就会报错 我们看:a = b = c: 程序会先运行

c#分部类型详解

一.先看代码来理解 代码一 1 class ClassA 2 { 3 void A(){;} 4 void B(){;} 5 } 代码二 1 partial class ClassA 2 { 3 void A(){;} 4 } 5 partial class ClassA 6 { 7 void B(){;} 8 } 代码一和代码二效果是一样的,引用类的成员完全一样,只是声明不不同而已.主要partial在这里是分部类型的关键词 编译过程图解 二.应用场景 1.嵌套在一个类里面 1 class C

JavaScript对象类型详解

JavaScript对象类型详解 JavaScrtip有六种数据类型,一种复杂的数据类型(引用类型),即Object对象类型,还有五种简单的数据类型(原始类型):Number.String.Boolean.Undefined和Null.其中,最核心的类型就是对象类型了.同时要注意,简单类型都是不可变的,而对象类型是可变的. 什么是对象 一个对象是一组简单数据类型(有时是引用数据类型)的无序列表,被存储为一系列的名-值对(name-value pairs).这个列表中的每一项被称为 属性(如果是函

Android 接口回调机制详解

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理. 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数