美文网首页
WebAPI服务返回值

WebAPI服务返回值

作者: 凌雲木 | 来源:发表于2017-09-30 16:55 被阅读615次

    Web API 2 Action Result 返回值

    • void
    • HttpResponseMessage
    • IHttpResponseMessage
    • Other Return Type

    1void 返回值

    返回空值204 (No content)
    例:

     #region 空返回值
            [HttpGet]
            public void Post()
            {
                //Console.WriteLine("code good");
            }
    
    Request URL:http://localhost:49064/Products/Post
    Request Method:GET
    Status Code:204 No Content
    Remote Address:[::1]:49064
    Referrer Policy:no-referrer-when-downgrade
    

    2HttpResponseMessage 返回值

    直接返回HTTP相应消息
    例:

       public HttpResponseMessage GetProduct(int id)
            {
                var product = products.FirstOrDefault(p => p.Id == id);
                if (product == null)
                {
                    //NotFound();
                    HttpResponseMessage response1 = Request.CreateResponse(HttpStatusCode.NotFound, product);
                    return response1;
                }
                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, product);
                // response.Content = new StringContent(id.ToString(), Encoding.Unicode);
                response.Headers.CacheControl = new CacheControlHeaderValue()
                {
                    // MaxAge = TimeSpan.FromMinutes(20)
                    MaxAge = TimeSpan.FromMilliseconds(10000)//设置缓存时间
                   
                };
                return response;
            }
    
    Request URL:http://localhost:49064/Products/Post
    Request Method:GET
    Status Code:204 No Content
    Remote Address:[::1]:49064
    Referrer Policy:no-referrer-when-downgrade
    

    3IHttpActionResult返回值

    Web API 2中引入了IHttpActionResult,它实质上它定义了一个异步的HttpActionResult工厂方法

     //
        // 摘要:
        //     定义一个用于以异步方式创建 System.Net.Http.HttpResponseMessage 的命令。
        public interface IHttpActionResult
        {
            //
            // 摘要:
            //     以异步方式创建 System.Net.Http.HttpResponseMessage。
            //
            // 参数:
            //   cancellationToken:
            //     要监视的取消请求标记。
            //
            // 返回结果:
            //     在完成时包含 System.Net.Http.HttpResponseMessage 的任务。
            Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
        }
    

    如果采用IHttpActionResult作为返回值,Web Api 将会异步的创建一个HttpResponseMessage类型对象,然后将它直接转化为Http相应。

    下面是一个实现了接口IHttpActionResult的类TextResult,它将返回一个纯文本http相应

    public class TextResult : IHttpActionResult
    {
        string _value;
        HttpRequestMessage _request;
    
        public TextResult(string value, HttpRequestMessage request)
        {
            _value = value;
            _request = request;
        }
        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(_value),
                RequestMessage = _request
            };
            return Task.FromResult(response);
        }
    }
    

    例:

     public IHttpActionResult GetData()
            {
                return new TextResult("纯文本信息", Request);
            }
    
    image.png image.png

    4其他返回类型

    For all other return types, Web API uses a media formatter to serialize the return value. Web API writes the serialized value into the response body. The response status code is 200 (OK).
    对于其他的返回类型,WebAPI根据媒体类型(MIME)格式化器序列化返回值,然后将其作为Http响应的内容,并且http响应码都是200.
    例:

           /// <summary>
            /// 其他返回类型        
            /// </summary>
            /// <returns></returns>
            public IEnumerable<Product> GetALL()
            {
                return products;
            }
    
    

    页面调用

     $(document).ready(function () {
          // Send an AJAX request
            $.getJSON("Products/GetALL")
              .done(function (data) {
                // On success, 'data' contains a list of products.
                $.each(data, function (key, item) {
                  // Add a list item for the product.
                  $('<li>', { text: formatItem(item) }).appendTo($('#product'));
                });
              });
        });
    
    

    值:

    [{"Id":1,"Name":"Hado Daved","Category":"fhjfs","Price":1.0,"start":"2017-09-29T15:12:27.1855723+08:00"},{"Id":2,"Name":"Yo-yo","Category":"Toys","Price":3.75,"start":"2017-09-29T07:12:27.1855723Z"},{"Id":3,"Name":"Hammer","Category":"Hardware","Price":16.99,"start":"2017-09-29T15:12:27.1855723+08:00"}]
    

    页面通过异步AJAX调用Web
    后台GetALL()方法根据请求的media formatter格式,将数据序列化为json数据。
    请求的media formatter类型在HTTP请求响应报文中:

    image.png

    Web API uses the Accept header in the request to choose the formatter. For more information, see Content Negotiation.
    Web API 不只在其他返回值类型,在上述所有的返回值类型中,Web API 实质上都是通过HTTP响应报文的media formatter格式来序列化返回值,(这个请求格式封装在请求上下文的Request对象的Accept header属性中)

    如还是请求上文的其他返回值类型 GetALL()方法,这次不通过异步调用,直接在浏览器地址调用

    image.png

    从图上可以看出请求的是文本类型,响应的也是文本类型。


    image.png

    WebAPI序列化后的时间数据格式<start>2017-09-29T15:32:27.5102052+08:00</start>,对于使用过JSON.NET的不会陌生,WEBAPI的序列化方法正是采用的JSON.NET,这比asp.net mvc 的json序列化方法(JavaScriptSerializer)性能高得多。

    相关文章

      网友评论

          本文标题:WebAPI服务返回值

          本文链接:https://www.haomeiwen.com/subject/mmteextx.html