zoukankan      html  css  js  c++  java
  • 浅析Web API中FromBody属性

    比较如下两段代码及测试结果:

    public class ValuesController : ApiController
    {
        // POST api/<controller>
        public string Post(string value)
        {
            return value;
        }
    }

     用swagger ui请求时,value的值为“1”或“a“均可返回。

    public class ValuesController : ApiController
    {
        // POST api/<controller>
        public string Post([FromBody]string value)
        {
            return value;
        }
    }

    用swagger ui请求时,value的值为“1”可正确返回,但为“a”时返回值为null。


    怎么回事?
    显然有必要了解一下FromBody特性,见如下mscor描述。通俗点说,FromBodyAttribute要求被其修饰的参数,必须是序列化后的实体成员。
    显然“a”不是序列化后的json串,而“"a"”才是。
    那么,“1”与“"1"”为什么都可以呢?这是一个技术细节,我们知道,在一个实体里如果定义了数值类型的属性,则在将这个实体的对象序列化后,它的这些数值参数默认是带双引号的。而实际上,将这些数值参数的双引号去掉,同样是一个有效的json串。所以,不难理解,“1”与“"1"”是等效的json串。

    #region 程序集 System.Web.Http.dll, v4.0.0.0
    // D:SourceProjectyi+.gatewayranches	runkOLdpackagesMicrosoft.AspNet.WebApi.Core.4.0.30506.0lib
    et40System.Web.Http.dll
    #endregion
    
    using System;
    using System.Web.Http.Controllers;
    
    namespace System.Web.Http
    {
        // 摘要: 
        //     一个特性,该特性指定操作参数仅来自传入 System.Net.Http.HttpRequestMessage 的实体正文。
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
        public sealed class FromBodyAttribute : ParameterBindingAttribute
        {
            // 摘要: 
            //     初始化 System.Web.Http.FromBodyAttribute 类的新实例。
            public FromBodyAttribute();
    
            // 摘要: 
            //     获取参数绑定。
            //
            // 参数: 
            //   parameter:
            //     参数说明。
            //
            // 返回结果: 
            //     参数绑定。
            public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);
        }
    }


    最后,贴上两种情况下swagger ui的页面请求截图:

    通过比较可以看到,两者的请求参数类型、curl和Request URL是有区别的:
    【value参数无FromBody特性的】
    value的Type是:query
    Curl:curl -X POST --header 'Accept: application/json' 'http://localhost:36024/api/Values?value=a'
    Request URL:http://localhost:36024/api/Values?value=a
    【value参数有FromBody特性的】
    value的Type是:body。这时需要选择Parameter content type,默认是application/json
    Curl:curl -X POST --header 'Content-Type: application/json' --header 'Accept: text/json' -d 'a' 'http://localhost:36024/api/Values'
    Request URL:http://localhost:36024/api/Values

    webapi默认返回的是json格式的字符串。从swagger ui的响应域的标签“Response Body”(不是Response Value)可以看出来,为swagger的细节点赞!

  • 相关阅读:
    jQuery小技巧
    HTML5 学习指导
    js对象排序&&倒序
    JS 中如何判断字符串类型的数字
    JavaScript中function的多义性
    JS 继承
    45.oracle表类型、数据拆分、表分区
    44.oracle表空间的使用
    43.oracle同义词
    42.oracle物化视图
  • 原文地址:https://www.cnblogs.com/buguge/p/6545025.html
Copyright © 2011-2022 走看看