精华内容
下载资源
问答
  • Web服务的接口类型

    2020-09-04 11:39:13
    REST风格 REST风格的web服务

    REST风格
    在这里插入图片描述
    REST风格的web服务
    在这里插入图片描述

    展开全文
  • c# WebApi之接口返回类型详解

    万次阅读 2017-11-27 14:49:31
    WebApi相关文章: C# 搭建一个简单的Web API项目 ...c# WebApi之接口返回类型详解 Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型void无返回值大家都知道voi

    WebApi相关文章:

    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;
    }

    这里写图片描述

    参考内容

    展开全文
  • 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用。 一、void无返回值 void...

     

    使用过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: 'http://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: 'http://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" });
            }

    同样的来看测试结果:

     

    2、Ok()、 Ok<T>(T content)

    除了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: 'http://localhost:21528/api/Order/GetNotFoundResult',
            data: { id :"cccc" },
            success: function (data, status) {
                alert(data);
            }
        });
    });
    复制代码

    得到结果

     

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



    4、其他

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

    4.1、Content<T>(HttpStatusCode statusCode, T value)

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

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

    4.2、BadRequest()

    复制代码
            [HttpGet]
            public IHttpActionResult GetBadRequest(ORDER order)
            {
                if (string.IsNullOrEmpty(order.ID))
                    return BadRequest();
                return Ok();
            }
    复制代码

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

    4.3、Redirect(string location)

            [HttpGet]
            public IHttpActionResult RedirectResult()
            {
                return Redirect("http://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的用法。

    首先,自定义一个实现类

    复制代码
       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变量。这里只是测试。
                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调用

    复制代码
    $(function () {
        $.ajax({
            type: 'get',
            url: 'http://localhost:21528/api/Order/GetPageRow',
            data: { limit:1,offset:1},
            success: function (data, status) {
                alert(data);
            }
        });
    });
    复制代码

    得到结果



    三、HttpResponseMessage

    在上文自定义IHttpActionResult返回类型的时候,提到过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);
                }
            }
    复制代码

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



    四、自定义类型

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

    复制代码
            [HttpGet]
            public object GetOther()
            {
                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 lstRes;
            }
    复制代码

    得到结果

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



    五、总结 

    以上通过四个方面详细分享了下WebApi里面返回值的常见用法,不能说哪种方式最好,因为每种方式都有其特定的使用场景。博主觉得为了规范WebApi接口,对于一般接口的返回值,尽量使用IHttpActionResult类型作为返回值,毕竟是微软内置的东西,可能为我们考虑了很多我们考虑不到的东西。当然,你可能会觉得麻烦,你可能会说直接和普通方法一样来使用不是更爽,博主当初也有这种想法,可是学习微软的东西多了之后发现很多东西还是遵守一定的标准比较好,至少维护起来方便。这就像博主最近正在努力学习的WebApi+oData一样,为什么要搞这么一套标准性的东西,还不是为了更加方便地规范Restful风格。如果本文能帮到你,不妨推荐下,您的推荐是博主继续总结的动力!

     

    原贴地址 : http://www.cnblogs.com/landeanfen/p/5501487.html#!comments

    转载于:https://www.cnblogs.com/refuge/p/8371415.html

    展开全文
  • 前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧。...使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值
  • 接口类型

    2019-06-13 15:58:32
    常见web接口:一类是http协议的接口,另一类是web service接口(如soup、rmi、rpc协议)。本文主要介绍http请求接口。 常见的http请求方式包括:get(查)、post(增),除此之外还有put(改)、delete(...

    接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

    常见web接口:一类是http协议的接口,另一类是web service接口(如soup、rmi、rpc协议)。本文主要介绍http请求接口。

    常见的http请求方式包括:get(查)、post(增),除此之外还有put(改)、delete(删)等。

    get型接口

    格式:请求数参数写在网址后面,用"?"连接,多个参数之间用"&"连接。如:https://api.douban.com/v2/book/search?q='',这是一个豆瓣查询图书信息的开发api,q='',单引号里就是查询的参数,如查询《小王子》这本书的信息,则q='小王子',使用postman工具来试验一下,如下图:


    场景:get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来

    特点:1)请求数据量小,2)参数暴露于url地址中,故存在安全隐患

    2)post型接口

    说明:向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立

    场景:如注册、上传、发帖等功能,如用户在豆瓣网站对某本书进行收藏、写笔记、发表评论

    特点:请求数据量大,安全性高

    如豆瓣的发表评论的开放api,见下图:


    3)put型接口

    说明:put请求用于向指定资源位置上传最新内容

    场景:如用户在豆瓣网站修改对某本书的收藏、修改某篇笔记或修改评论

    如豆瓣的修改评论的开放api,见下图:


    4)delete型接口

    说明:请求服务器删除请求里url所标识的资源

    场景:如用户在豆瓣网站取消对某本书的收藏、删除某篇笔记或删除评论

    如豆瓣的删除评论的开放api,见下图:


    展开全文
  • 一、背景 ...根据现有逻辑,前台请求http接口的Content-Type有两种,application/json和application/x-www-form-urlencoded。现要求两种请求方式都能够进行参数绑定。想到通过自定义一个HandlerM...
  • 阅读目录 一、void无返回值 二、IHttpActionResult 1、Json(T content) ...5、自定义IHttpActionResult接口的实现 三、HttpResponseMessage 四、自定义类型 五、总结 正文 使用过We...
  • 前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来...使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IH...
  • 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值IHttpActionResultHttpResponseMessage自定义类型 此篇就围绕这四块分别来看看它们的使用。 回到顶部 一、void无返回值 ...
  • 之前分享过一篇WebApi 接口参数:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持。作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,...
  • Asp.Net WebAPI配置接口返回数据类型为Json格式 一、默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XMLRequest,或者AngularJs的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,499
精华内容 1,799
关键字:

web接口类型